extern关键字(2) extern "C"

C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,

C语言则不会,直接将会将函数名作为中间函数名称。

因此C++程序调用C方式编译的函数时, 可能会在链接时找不到对应的函数。

例子:

// extern.h

1 int sum(int a,int b);

//extern1.c

1 int sum(int a,int b)
2 {
3         return a+b;
4 }

//extern2.cpp

#include <iostream>
using namespace std;
extern  int sum(int a,int b);
int main()
{
        cout<<sum(3,2)<<endl;
        return 0;
}

编译: gcc -c extern1.c       //按照c的方式编译sum函数

g++ -c extern2.cpp   // 按照c++的方式调用sum函数

然后: g++ extern2.o extern1.o   //链接成exe

注: 对于.c后缀名的程序,gcc认为是c程序,g++认为是c++程序; 对于.cpp后缀名的程序,gcc和g++都认为是c++程序。

结果:

extern2.o: In function `main':
extern2.cpp:(.text+0xf): undefined reference to `sum(int, int)'
collect2: ld returned 1 exit status

//正确的使用旧文件extern.c中sum函数的方法:extern3.cpp

1 #include <iostream>
2 using namespace std;
3 extern "C" {int sum(int a,int b);}
4 int main()
5 {
6         cout<<sum(3,2)<<endl;
7         return 0;
8 }

链接: g++ extern1.o    extern3.o     正确!

总结: 当c++程序需要调用之前用C方式编译出来的.a .so, 可以使用 extern "C". 

原文地址:https://www.cnblogs.com/yaozhaoyz/p/2755817.html