在下面的代码中,能否解释一下为什么在函数指针声明之后使用 extern?
myfuncs.h
typedef void (*initMyfuncs_t)(Init_t*, CallBacks_t *,result_t*);
extern initMyfuncs_t _initMyfuncs;
我们在 myfunc.c 文件中使用它
void *glbfuncs=NULL
glbfuncs = dlopen("glbfuncs.so",RTLD_NOW);
initMyfuncs_t _initMyfuncs=NULL;
_initMyfuncs = dlsym(glbfuncs, "_initMyfuncs");
通常,我们在使用该函数指针或变量的文件或其他头文件中使用 extern。 这里我们在头文件中声明了 extern 并在同一源文件中使用它。 这里使用extern有什么用
并且这个函数指针在没有 extern 声明的情况下被其他源文件使用。我对此感到困惑吗?一般来说,我们在某个地方(somehere.h)有一个声明,如果我们在其他文件(here.h或here.c)中使用它,我们使用 extern 关键字只是为了获取这个变量。
我不太明白在 typedef 之后使用 extern 关键字的原因。
为什么在同一个头文件中声明函数指针之后要使用extern。
最佳答案
需要extern
关键字来区分全局数据对象(例如函数指针)的声明和该对象的定义。
在头文件中,应该只有声明。定义属于源文件,不应在不同的源文件中重复。如果将定义放在头文件中,则最终会在链接时得到相同符号的多个定义。由于历史原因,通用链接器如果没有初始值设定项,则接受这些多个定义。尽管如此,这被认为是不好的做法,应该避免。
myfuncs.h
extern initMyfuncs_t _initMyfuncs; // declaration of function pointer
myfuncs.c
initMyfuncs_t _initMyfuncs = some_function; // actual definition of the pointer with optional initializer.
困惑来自于函数指针的typedef,与函数原型(prototype)不同。即使没有 extern
关键字,函数原型(prototype)也是一个声明。
关于c - 在同一头文件中声明函数指针之后使用 extern 的优点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30694096/