区别extern“C”vs extern
我是否对整个标题使用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 ++中引入重载函数时,需要为不同函数指定相同名称的方法。 例如,void f()
和void f(int)
是C ++中的不同函数。
为此,C ++编译器实现了所谓的修改。 它向函数名称添加了一些与函数参数相关的信息。
extern "C"
表示命令编译器“引用旧式命名约定 – 不进行修改”
这两件事有所不同。
第一个说“这里的函数应该被编译,以便可以从C调用”。 C ++允许多个函数具有相同的名称,只要它们采用不同的参数即可。 C没有。 为此,C ++在其函数的编译名称中包含参数类型信息。 因此,C编译器将无法找到这些函数。 如果你添加一个extern "C"
然后你得到C行为,但你获得了从C调用这些函数的能力。
后者说“这个函数存在于另一个编译单元中”。 这意味着编译器应该相信具有该签名的函数存在但不担心无法看到它。 当你联系时,它会存在,你保证。 默认情况下,声明(与定义形成对比)是extern,因为至少是C99。