博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
“#ifdef __cplusplus extern "C" { #endif”的定义
阅读量:4193 次
发布时间:2019-05-26

本文共 1404 字,大约阅读时间需要 4 分钟。

平时我们在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 
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 
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 
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 __cpluspluscout << "cout mytest extern ok " << endl;#elseprintf("printf mytest extern ok n");#endif}//main.cpp#include "test.h"int main(){mytest();return 0;}

 

转载地址:http://zjloi.baihongyu.com/

你可能感兴趣的文章
游族网络:中诚信国际将公司主体及游族转债列入信用评级观察名单
查看>>
雷军谈小米股价:长达两年低于发行价 让我超级郁闷
查看>>
小米11正式发布:售价惊喜,充电器方案神奇!
查看>>
三星Galaxy S21+真机上手视频曝光:外观彻底无悬念
查看>>
十大下班最晚城市,四个在广东
查看>>
福特电动汽车负责人嘲讽特斯拉:新野马“车顶可不会掉”
查看>>
iPhone质量成迷?被吴彦祖一箭射穿,却还能开机
查看>>
2020魔幻“商战”:抢公章、发黄图、半夜翻工厂...最烂的小说都不敢这么写
查看>>
拼多多股价创新高 市值突破2000亿美元
查看>>
拼多多市值超2100亿美元 黄峥成中国第二大富豪
查看>>
小米11 Pro外观配置曝光:四摄加持、2K 120Hz四曲面屏
查看>>
《消费者报告》杂志:Model 3和Model S被评选为美国最佳豪华汽车
查看>>
官宣预热iQOO 7强悍配置:“性能铁三角”加持 给你强悍全感
查看>>
淘宝年度十大冷门职业公布:螺蛳粉闻臭师、丝袜调色师等入选
查看>>
滚蛋吧,2020的糟心事儿!2021,先“拼”为敬!
查看>>
改文案、删微博又道歉 广汽蔚来自导自演“比特币购车”乌龙案
查看>>
电动汽车冬季悲歌:我不是在充电,就是在充电的路上
查看>>
饿了么2020外卖备注图鉴:12个关键词覆盖我们的生活
查看>>
特斯拉2020全年交付49.955万辆车,未能完成50万辆目标
查看>>
比亚迪汽车发布品牌全新标识 取消了椭圆型边界
查看>>