关于c ++:extern“C”和简单extern之间的区别

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);

会让someFunction有C连杆。 </P >


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 >