difference between extern “C” and simply extern
我已经看到C/C++代码使用在函数签名中声明的"外部""C",同时也将C头包含到CPP文件中。
但有些函数只是在它们的签名之前声明extern(没有"c")。
QN1:
这两种定义函数的方法有相同的效果吗,还是意味着不同的东西?
对不起,如果我很傻,但我不能通过谷歌找到这个区别。
如:
1 2 3 | extern int someFunction( void *ret_val); extern"C" int someFunction( void *ret_val); |
QN2:
如果函数的签名中声明了一个extern,那么是否需要在extern"c"块中包含相应的头文件?
正如其他用户在注释中指出的那样,标记的副本不完全满足此处的问题。我正在编辑,以便将来其他人不会被误导到另一个问题中。
extern"C"disables name的损坏。它将允许你的C + +代码的调用函数库中的C编译器编译通过 </P >
1 | extern"C" int someFunction( void *ret_val); |
会让
extern"C"简单的均值,下面的代码块中可以either编译用C编译器或CPP。这是当你有一个做的混合物的C / C + +代码,你需要保持跟踪研究语言的特异性的特征。在一位更geeky通,《C连杆成为兼容在在场的一个CPP的编译器。 </P >
该代码可能的任何事情都是从一个变量/函数定义的一种全/模块的宣言。 </P >
但是,如果你做这个: </P >
1 | extern char c; // same goes true for extern int foo() |
它的均值,你是想说"我是使用字符c,这有一个外部文件到这个宣言"。更多的像在另一个模块的某个地方。在搜索路径。这是implicitly全球。在运行时,如果C的变化,变化的是reflected是。。。。。。。这是对你的编译器提供的指示,如你iinclude _文件_ dirs - ssource _文件_ dirs等。是提供correctly(GCC或G + +)。使用一种powerful IDE如Visual Studio 2010年或以后,你能做这些甚易。 </P >
"extern"是一个关键词连杆。你可以combine它与"C"方法的特异性连杆的编译器指令。 </P >