为什么不能直接调用:
在编译的时候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中自然不能用了....,况且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++源码阔在括号里面
//c语言最难调用的是被封装起来的c++源代码。
扩展:
#ifdef _cplusplus //c++编译器内置宏
extern "C"
{
#endif
//code,....
#ifdef _cplusplus
}
#endif
//这段宏表示,不论是c++还是c代码,都可以生成c的符号