C和C++如何相互调用

为什么不能直接调用:
在编译的时候c和c++生成符号的规则不同,所以直接调用会出现符号未定义的链接错误。
示例1:下面演示相互调用接口错误示例:
// test.c

int sum(int a, int b)
{
 return a + b;
}

// main.cpp

int sum(int a, int b); //在本文件中声明一下
int main()
{
 int m = sum(10, 10);
 cout << m << endl;
 return 0;
}

执行结果:编译没有错误,链接发生错误
错误 1 error LNK2019: 无法解析的外部符号 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z),该符号在函数 _main 中被引用 
错误 2 error LNK1120: 1 个无法解析的外部命令

示例2:c++调用c的接口正确调用
还是上面的代码,在main.cpp中加上extern “C”:

原理:告诉C++编译器,里面的符号规则按照c的规则生成
c++编译器既能产生c符号,也能产生c++的符号
c编译器只能产生c符号
extern "C"
{
 int sum(int a, int b); //在本文件中声明一下 
 //将要使用的c的接口的函数声明放到这个里面就好了
}

int main()
{
 int m = sum(10, 10);
 cout << m << endl;
 return 0;
}
执行结果:
20


extern "c"是c++中的语法,c中自然不能用了....

示例3:c语言正确调用c++的接口
依然是extern “C”,且一定用在cpp中
// test.c

int sum(int a, int b);//声明
int main()
{
 int m = sum(10, 10);
 return 0;
}

// main.cpp

extern "C"
{
 int sum(int a, int b)
 {
  return a + b;
 }
}
//这里是将cpp中的函数定义放在其中,告诉编译器按照c语言生成符号的规则产生函数符号
//将所有c++源码阔在括号里面

扩展:

#ifdef  _cplusplus    //c++编译器内置宏
extern "C"
{
	#endif
	//code,....
#ifdef _cplusplus
}
#endif

//这段宏表示,不论是c++还是c代码,都可以生成c的符号

猜你喜欢

转载自blog.csdn.net/KingOfMyHeart/article/details/89226061
今日推荐