C compiler和C++ compiler将.c/.cpp编译成.obj时候给一个方法命名时候所采
用的方案是不同的,C compiler比较简单,加一个下滑线"_",比如
foo() => _foo。
而C++由于有了function overload以及namespace等机制,稍微复杂了一些。比如
foo() =可能=> _@@@foo@_$$
当混合使用C和C++进行变成的时候,会出现一些问题,比如我现在有一个
a.obj,它是用C写的,里面有一个foo(),因此a.obj中它是_foo。
而现在我把这个.obj用于我的一个C++工程:
//b.cpp
void foo()
int main() {
foo();
return 0;
}
当我用C++ compiler编译b.cpp的时候,foo这个方法会变成_@@@foo@_$$
然后存入obj中,接着我link a.obj和b.obj,linker会从两个obj中
查找关于_@@@foo@_$$的定义,并且将他们连结起来,但是它找不到_@@@foo@_$$
的定义了,因为只有_foo的定义在a.obj中。
因此,要解决这个问题,必须要保持两个obj文件中foo的一致性,extern "C"就是
解法,上面的程序改为:
extern "C" void foo()
int main() {
foo();
return 0;
}
则,C++编译器就会采用C的命名方式,_@@@foo@_$$不会出现在b.obj中,而变成_foo。