8

我已经看到 C/C++ 代码使用在函数签名中声明的 extern "C" 以及在 CPP 文件中包含 C 标头。

但有些函数只是在签名之前声明 extern(没有“C”)。

QN1:

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

抱歉,如果我很傻,但我无法通过 Google 找到这种差异。

例如:

extern int someFunction( void *ret_val);

extern "C" int someFunction( void *ret_val);

QN2:

如果函数在其签名中使用 extern 声明,是否有必要将相应的头文件包含在 extern "C" 块中?

正如另一位用户在评论中指出的那样,标记的副本并不完全满足这里的问题。我正在编辑,以便将来其他人不会被误导到不同的问题。

4

3 回答 3

7

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

于 2015-01-20T14:54:50.180 回答
4
extern "C" int someFunction( void *ret_val);  

将使someFunction有C联动。

于 2015-01-20T14:54:36.323 回答
2

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

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

但如果你这样做:

extern char c; // same goes true for extern int foo()

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

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

于 2015-01-20T14:54:49.177 回答