我是否对整个标题使用extern "C"
说明符,或为每个函数指定extern
有区别吗?
据我所知,没有,因为只有函数和变量可以在外部链接,所以当我在每个函数原型和extern变量之前使用extern
说明符时,我不需要使用全局extern "C"
声明!?
例A:
#ifdef __cplusplus
extern "C" {
#endif
void whatever(void);
#endif
例B:
extern void whatever(void);
extern "C"
意味着从C ++代码调用C库函数。
有什么不同?
很久很久以前,C编译器只按名称生成代码和寻址函数。它没有考虑参数。
当在C ++中引入重载函数时,需要extern "C"
为不同的函数指定相同的名称。例如,void f()
和void f(int)
是C ++中的两个不同函数。
C ++编译器通过名称修改实现了这一点。它会向与函数参数相关的函数名称添加一些信息。
extern "C"
是一个命令编译器“引用旧式命名约定 - 没有修改”。
这两件事有所不同。
第一个说“这里的函数应该被编译,以便可以从C调用”。 C ++允许多个函数具有相同的名称,只要它们采用不同的参数即可。 C没有。为此,C ++在其函数的编译名称中包含参数类型信息。因此,C编译器将无法找到这些函数。如果你添加一个extern "C"
然后你得到C行为,但你获得了从C调用这些函数的能力。
后者说“这个函数存在于另一个编译单元中”。这意味着编译器应该相信具有该签名的函数存在但不担心无法看到它。当你联系时,它会存在,你保证。声明(与定义形成对比)默认为extern,至少是C99。