先举个简单的例子,把如下代码保存为test.cpp
extern "C" { int foo() { return 1; } } int bar() { return 1; }
然后如下编译为obj文件,g++ -c test.cpp -o test.o
然后运行如下命令 nm test.o (查看obj文件中的symbols names)
得到如下结果
00000000 T foo 0000000a T _Z3barv
这里可以看出区别,如果一个c++文件函数的定义加上了 extern "C" 那么它生成obj文件时,用于链接用的名字会按照c语言obj形式来生成,而不进行name magling。
这样做的好处如下,假设另有一个main.c,如下
#include <stdio.h> int foo(); int _Z3barv(); int main(){ _Z3barv(); foo(); return 0; }
可以看到如果c++ 函数不加extern "C" 那么如果想用它的代码进行链接,则需要手动在C源文件中进行转换,没人喜欢这种转换吧。。。