外部"C"和简单外部之间的区别

Moh*_*zas 3 c c++ extern-c

我已经看到C/C++代码使用在函数签名中声明的extern"C",并且还在将CP头包含到CPP文件中时使用.

但有些函数只是在签名之前声明extern(没有"C").

QN1:

这两种定义函数的方式是否具有相同的效果,还是它们意味着不同的东西?

对不起,如果我很傻,但我无法通过谷歌找到这种差异.

例如:

extern int someFunction( void *ret_val);

extern "C" int someFunction( void *ret_val);
Run Code Online (Sandbox Code Playgroud)

QN2:

如果函数在其签名中声明了extern,那么相应的头文件是否必须包含在extern"C"块中?

正如评论中的另一个用户所指出的那样,标记的副本并不完全满足此处的问题.我正在编辑,以便将来其他人可能不会误导成另一个问题.

low*_*ech 7

extern"C"禁用名称修改.它将允许您的C++代码从C编译器编译的库中调用函数


ha9*_*3ar 2

C++ 文件中存在extern "C"是个人意图,旨在禁用C++ 编译器对该文件中的函数执行的名称修改转换。当没有名称修改时,客户端 C 代码可以调用这些函数。当您混合使用 C/C++ 代码并且需要跟踪特定于语言的功能时,可以这样做。以一种更极客的方式,C 链接在 Cpp 编译器存在的情况下变得兼容。

代码可以是从变量/typedef 到完整函数/模块声明的任何内容。

但如果你这样做:

extern char c; // same goes true for extern int foo()
Run Code Online (Sandbox Code Playgroud)

这意味着您是在说“我正在使用 char c,它在该文件外部有一个声明”。更像是在搜索路径中的另一个模块中。这是隐含的全局性的。在运行时,如果 c 发生变化,则该变化会反映到各处。前提是您的编译器指令(例如 -Iinclude_file_dirs -Ssource_file_dirs 等)正确提供(在 GCC 或 g++ 上)。使用功能强大的 IDE(例如 Visual Studio 2010 或更高版本),您可以非常轻松地完成这些操作。

“extern”是一个链接关键字。您可以将其与“C”结合使用以获取特定于编译器的链接指令。