我经常看到编码如下的程序:
extern "C" bool doSomeWork() {
//
return true;
}
为什么我们使用extern "C"
块?我们可以用C ++中的东西替换它吗?使用extern "C"
是否有任何好处?
我确实看到了一个解释this的链接,但为什么我们需要在已经有C ++的情况下用C语言编译?
答案 0 :(得分:32)
extern“C”使名字没有被破坏。
它用于:
我们需要在C ++中使用一些C库
extern "C" int foo(int);
我们需要将一些C ++代码导出到C
extern "C" int foo(int) { something; }
我们需要能够解析共享库中的符号 - 所以我们需要摆脱错位
extern "C" int foo(int) { something; }
///
typedef int (*foo_type)(int);
foo_type f = (foo_type)dlsym(handle,"foo")
答案 1 :(得分:14)
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,然后可以从其他编程语言调用,因为编译不会破坏它的名字。如果您添加了同一功能的另一个重载,例如
extern "C" void __stdcall PrintHello() {
cout << "Hello World" << endl;
}
extern "C" void __stdcall PrintHello(const char *name) {
cout << "Hello, " << name << endl;
}
大多数编译器会捕获这个,从而阻止你在DLL-public函数中使用函数重载。