我试图找出以下前向声明在ANSI-C中是否有效:
第一档:
extern void * fptr; // opaque forward declaration.
int main (void) {
fptr = NULL; // set the function pointer to NULL
}
Run Code Online (Sandbox Code Playgroud)
第二档:
typedef int (*fptr_t)(int);
fptr_t fptr; // real declaration of the function pointer
Run Code Online (Sandbox Code Playgroud)
对我来说,这应该是无效的,因为fptr如果用两种不同的类型声明,但既没有gcc也没有clang给出任何警告.
我会更具体地对C11标准的精确点感兴趣,这些点可以得出结论为什么它有效(或无效).
编辑:在C11标准中,6.2.7:2说:
引用同一对象或函数的所有声明都应具有兼容类型; 否则,行为未定义.
但我找不到如何判断是否void*兼容fptr_t.