何时在C ++中使用extern“C”?

可能重复:
为什么我们需要在C ++中使用extern“C”{#include }?

我经常看到程序编码如下:

extern "C" bool doSomeWork() { // return true; } 

为什么我们使用extern "C"块? 我们可以用C ++中的东西替换它吗? 使用extern "C"有什么好处吗?

我确实看到一个解释这个的链接但是为什么我们需要在已经有C ++的情况下用C语言编译?

extern“C”使名字没有被破坏。

它用于:

  1. 我们需要在C ++中使用一些C库

     extern "C" int foo(int); 
  2. 我们需要将一些C ++代码导出到C

     extern "C" int foo(int) { something; } 
  3. 我们需要能够解析共享库中的符号 – 所以我们需要摆脱错位

     extern "C" int foo(int) { something; } /// typedef int (*foo_type)(int); foo_type f = (foo_type)dlsym(handle,"foo") 

extern“C”有意义的地方是当你链接到编译为C代码的库时。

 extern "C" { #include "c_only_header.h" } 

否则,您可能会遇到链接器错误,因为该库包含具有C-linkage(_myfunc)的函数,但是C ++编译器将库的头部处理为C ++代码,为函数生成C ++符号名称(“_myfunc @ XAZZYE” – 这是称为mangling,每个编译器都不同)。

使用extern“C”的另一个地方是保证C链接,即使对于用C ++编写的函数,例如。

 extern "C" void __stdcall PrintHello() { cout << "Hello World" << endl; } 

这样的函数可以导出到DLL,然后可以从其他编程语言调用,因为编译不会破坏它的名字。 如果您添加了同一function的另一个重载,例如。

 extern "C" void __stdcall PrintHello() { cout << "Hello World" << endl; } extern "C" void __stdcall PrintHello(const char *name) { cout << "Hello, " << name << endl; } 

然后,大多数编译器会捕获这个,从而阻止您在DLL-public函数中使用函数重载。