Я пытаюсь выяснить, имеет ли в ANSI-C следующее утверждение:
Первый файл:
extern void * fptr; // opaque forward declaration.
int main (void) {
fptr = NULL; // set the function pointer to NULL
}
Второй файл:
typedef int (*fptr_t)(int);
fptr_t fptr; // real declaration of the function pointer
Для меня это должно быть недействительным, поскольку fptr
, если объявлено двумя разными типами, но ни gcc
, ни clang
не дает никаких предупреждений.
Я бы более конкретно интересовался точными точками стандарта C11, которые позволяют заключить, почему он действителен (или недействителен).
EDIT: в стандарте C11, 6.2.7: 2 говорит:
Все объявления, относящиеся к одному объекту или функции, должны иметь совместимый тип; в противном случае поведение undefined.
Но я не могу найти, как решить, совместим ли void*
с fptr_t
.