"); //-->
平时我们在linux c平台开发的时候,引用了一些Cpp或者C的代码库,发现一些头文件有如下代码条件编译。
#ifdef __cplusplusextern "C" {#endif// 代码#ifdef __cplusplus
}#endif这个是什么意思呢?一开始看到这个也很茫然。上网查找了一些资料。
主要作用:
为了在C++代码中调用用C写成的库文件,就需要用extern"C"来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。
原因:
C++支持函数重载,而C是不支持函数重载的,两者语言的编译规则不一样。编译器对函数名的处理方法也不一样。
假设有这个一个函数原型:
void func(int a,int b)
{ //code }可能在C++编译之后会产生_func_int_int之类的名字,因为C++支持重载。而C编译之后,可能为_func。
关键字:extern "C" 表示编译生成的内部符号名使用C约定。
//C++引用C函数的例子//test.c#include <stdio.h>void mytest()
{
printf("mytest in .c file ok\n");
}//main.cppextern "C"{void mytest();
}int main()
{
mytest();return 0;
}//在C中引用C++函数//在C中引用C++语言中的函数和变量时,C++的函数或变量要声明在extern "C"{}里,但是在C语言中不能使用extern "C",否则编译出错。//test.cpp#include <stdio.h>extern "C"{void mytest()
{
printf("mytest in .cpp file ok\n");
}
}//main.cvoid mytest();int main()
{
mytest();return 0;
}//综合使用//一般我们都将函数声明放在头文件,当我们的函数有可能被C或C++使用时,我们无法确定是否要将函数声明在extern "C"里,所以,我们应该添加#ifdef __cplusplusextern "C"{#endif//函数声明#ifdef __cplusplus
}#endif如果我们注意到,很多头文件都有这样的用法,比如string.h,等等。
//test.h#ifdef __cplusplus
#include <iostream>using namespace std;extern "C"{#endifvoid mytest();
#ifdef __cplusplus
}#endif
这样,可以将mytest()的实现放在.c或者.cpp文件中,可以在.c或者.cpp文件中include "test.h"后使用头文件里面的函数,而不会出现编译错误。
//test.c#include "test.h"void mytest()
{
#ifdef __cplusplus
cout << "cout mytest extern ok " << endl;#elseprintf("printf mytest extern ok n");#endif}//main.cpp#include "test.h"int main()
{
mytest();return 0;
}参考博文:
http://www.cnblogs.com/HappyXie/archive/2011/01/07/1929369.html
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
美国出口管制瞄准存储及成熟芯片
Google TPU强势挑战NVIDIA
MAX9750_MAX9751_MAX9755 2.6W立体声音频功率放大器
INA105精密单位增益缓冲电路
MAX8550_MAX8551 集成式DDR 电源方案
硅谷AI权力的游戏开启新支线
IPv6协议——下一代互联网的核心
MAX9722A_MAX9722B立体声耳机放大器
MAX4795, MAX4796, MAX4797, MAX4798 450mA_500mA限流开关
MAX9725固定增益、立体声耳机放大器
增强现实智能眼镜未来的两个愿景
INA105虚地产生电路
[Android开发视频教学]广播机制(一)(21)
IP电话语音质量的评价与分析
[Android开发视频教学]广播机制(二)(22)
[Android开发视频教学]XML文件解析(20)
远程机器人技术有望扩大中风治疗的可及性
[Android开发视频教学]WIFI网络操作(23)
2003年热门赚钱领域大预测
英特尔据报道还在挖角台积电亚利桑那工程师,薪资高出20%至30%
嵌入式工程师必看!接口协议,不是通了就行,这么简单。
联通CDMA步步紧逼
精密平均值放大电路(INA105)
事件传感器为设备制造商带来恰到好处的数据
差动输入电压-电流变换器(INA105)
2003,期待单向收费
[Android开发视频教学]Socket编程(24)
具有差动输出的差分放大器(INA105)
收听质子,价格低于100美元
AI当前技术路线后劲不足:模型虽持续改进,但无法实现AGI