差异外部" C" vs extern

时间:2017-05-18 19:37:19

标签: c++ c extern

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

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

示例A:

#ifdef __cplusplus
extern "C" {
#endif

void whatever(void);

#endif

例B:

extern void whatever(void);

2 个答案:

答案 0 :(得分:10)

extern "C"表示从C ++代码调用C库函数。

有什么区别?

很久很久以前,C编译器只按名称生成代码和寻址函数。 它没有考虑参数。

当在C ++中引入重载函数时,需要extern "C"为不同的函数指定相同的名称。例如,void f()void f(int)是C ++中的两个不同函数。

C ++编译器通过名称修改实现了这一点。它为与函数参数相关的函数名称添加了一些信息。

extern "C"是一个命令编译器“引用旧式命名约定 - 没有修改”。

答案 1 :(得分:8)

这两件事之间存在差异。

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

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