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

先举个简单的例子,把如下代码保存为test.cpp

C++中的 extern "C" 的作用
extern "C" {
  int foo() {
    return 1;
  }
}

int bar() {
  return 1;
}
C++中的 extern "C" 的作用

然后如下编译为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,如下

C++中的 extern "C" 的作用
#include <stdio.h>
int foo();
int _Z3barv();
int main(){
    _Z3barv();
    foo();
    return 0;
}
C++中的 extern "C" 的作用

可以看到如果c++ 函数不加extern "C" 那么如果想用它的代码进行链接,则需要手动在C源文件中进行转换,没人喜欢这种转换吧。。。

 

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

上一篇:hdu 4549 M斐波那契数列 矩阵快速幂+欧拉定理


下一篇:43 【redis cluster】