c - 在同一头文件中声明函数指针之后使用 extern 的优点

标签 c function-pointers extern

在下面的代码中,能否解释一下为什么在函数指针声明之后使用 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/

相关文章:

c - read() 和 pread(),哪种方式效率更高?

c++ - 函数指针的赋值(effective c++ item 35)

c - 指针和指针变量有什么区别?

c - 如何使用位于结构中的函数指针来运行函数? (C)

c99 - 数组的外部声明

java - Android SSL JNI结构?

c - 使用 opus_decode_float 使用 Opus API 解码

c++ - 在不同文件中使用相同的变量(使用 extern)

C - 获取下一行

c - 为什么在下面的 C 代码中多次定义变量没有错误?