区别extern"C"vs extern

6 c c++ extern

我是否使用extern "C"整个标题的说明符,或extern为每个函数指定是否有区别?

据我所知,没有,因为只有函数和变量可以在外部链接,所以当我extern在每个函数原型和extern变量之前使用说明符时,我不需要使用全局extern "C"声明!?

例A:

#ifdef __cplusplus
extern "C" {
#endif

void whatever(void);

#endif
Run Code Online (Sandbox Code Playgroud)

例B:

extern void whatever(void);
Run Code Online (Sandbox Code Playgroud)

Dmi*_*roh 10

extern "C" 表示您使用C++代码中的调用C库函数.

有什么区别?

很久以前,C编译器按名称生成代码和地址函数.所以它不考虑参数.

当在C++中引入重载函数时,需要为不同函数指定相同名称的方法.例如空隙extern "C"f()是++ C中的不同的功能.

为此,C++编译器实现了所谓的修改.它为函数名称添加了一些与函数参数相关的信息.

void f(int) 意味着对编译器的命令"引用旧式命名约定 - 不破坏"


Tom*_*mmy 9

这两件事有所不同.

第一个说"这里的函数应该被编译,以便可以从C调用".C++允许多个函数具有相同的名称,只要它们采用不同的参数即可.C没有.为此,C++在其函数的编译名称中包含参数类型信息.因此,C编译器将无法找到这些函数.如果你添加一个extern "C"然后你得到C行为,但你获得了从C调用这些函数的能力.

后者说"这个函数存在于另一个编译单元中".这意味着编译器应该相信具有该签名的函数存在但不担心无法看到它.当你联系时,它会存在,你保证.声明(与定义形成对比)默认为extern,至少是C99.