代码改变世界

C++中的 extern "C" 的作用

2014-02-21 09:16  Ryan_Liu  阅读(389)  评论(0编辑  收藏  举报

先举个简单的例子,把如下代码保存为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源文件中进行转换,没人喜欢这种转换吧。。。