我见过使用extern" C"的C / C ++代码。在函数签名中声明,同时将C头包含在CPP文件中。
但有些函数只是在签名之前声明extern(没有" C")。
QN1:
这两种定义函数的方式是否具有相同的效果,还是它们意味着不同的东西?
抱歉,如果我很傻,但我无法通过谷歌找到这种差异。例如:
extern int someFunction( void *ret_val);
extern "C" int someFunction( void *ret_val);
QN2:
如果函数在其签名中声明了extern,则相应的头文件是否必须包含在extern中?" C"方框?
正如评论中的另一位用户所指出的那样,标记的副本并不完全满足此处的问题。我正在编辑,以便将来其他人可能不会误导成另一个问题。
答案 0 :(得分:7)
extern" C"禁用名称重整。它将允许您的C ++代码从C编译器编译的库中调用函数
答案 1 :(得分:4)
extern "C" int someFunction( void *ret_val);
会使someFunction
具有C链接。
答案 2 :(得分:0)
extern“C”只是意味着可以使用C或Cpp编译器编译以下代码块。当您混合使用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”结合使用,以用于特定于编译器的链接指令。