是对整个头部使用extern "C"说明符,还是为每个函数指定extern,这有什么区别吗?
据我所知,没有,因为只有函数和变量可以外部链接,所以当我在每个函数原型和外部变量之前使用extern说明符时,我不需要使用全局extern "C"声明!?
示例A:
#ifdef __cplusplus
extern "C" {
#endif
void whatever(void);
#endif示例B:
extern void whatever(void);发布于 2017-05-19 03:58:35
C++文件中的extern "C"允许从C客户机调用方代码调用特定的C++函数。
有什么关系?
很久很久以前,C编译器生成的代码和寻址的函数都是按名称命名的。它没有考虑参数。
在C++中引入重载函数时,需要extern "C"为不同的函数指定相同的名称。例如,在C++中,f()和void f(int)是两个不同的函数。
C++编译器通过名称篡改实现了这一点。它将一些信息添加到与函数参数相关的函数名称中。
extern "C"是对编译器的一个命令,用于“引用旧风格的命名约定--没有损坏”。
发布于 2017-05-19 03:59:44
这两件事是有区别的。
第一个是“这里的函数应该被编译成可以从C调用”。C++允许多个函数具有相同的名称,只要它们采用不同的参数。C则不会。为此,C++在其函数的编译名称中包含了参数类型信息。因此,C编译器将无法找到这些函数。如果您添加了一个extern "C",那么您将获得C行为,但您将获得从C调用这些函数的能力。
后者表示“此函数存在于另一个编译单元中”。这意味着编译器应该相信具有该签名的函数存在,而不是担心看不到它。你保证你链接的时候它就会在那里。声明(与定义相反)默认情况下是外部的,因为至少是C99。
https://stackoverflow.com/questions/44056461
复制相似问题