1C与C++相互调用
在一个嵌入式系统中大部分的底层和驱动层更多的是采用C语言来进行开发,而上层应用、服务更多的采用C++等高级语言来进行面向对象等方面的开发方式,那么就存在一个上层调用底层接口的问题,比如最常用的C++调用C的接口来完成相应的外设驱动接口。
我们知道C++几乎是完全兼容C的,不同的编译语言都有其自身的一套编译规则,当然C语言与C++的编译规则是不同的,但C++编译器为了兼容C语言相当于兼容了C语言编译方式,而C语言编译器一般就不会去兼容C++的编译方式。
所以理论上来说用C编译器编译好的模块能够直接通过C++来进行调用才对。
2extern关键字
由于C++编译器默认都是按照C++的编译方式来对源文件进行编译,这样C语言文件也会直接采用C++编译。
对于底层的驱动等都会以使用C语言编写的DLL等给出来,然后从中导出函数给C或C++的模块来进行访问,所以还是需要C++语法中能够标识出来给编译器,哪些需要采用C++方式编译,哪些需要采用C方式编译。
那么这个编译区分就由extern “C”来完成,下面我们就以一个例子看看如何使用的。
//FileName:main.c #include#include #include"Cal.h" intmain(intargc,char**argv){ printf("Cal(int):%d ",Cal(5)); printf("Cal(float):%.5f ",Cal(1.1f)); return0; }
//FileName:Cal.c #include"Cal.h" intCal(intVal) { returnVal*Val; } floatCal(floatVal) { returnVal*Val; }
//FileName:Cal.h #ifndef__CAL_H__ #define__CAL_H__ //extern"C" //{ intCal(intVal); floatCal(floatVal); //} #endif
以上extern “C”注释部分表示的就是Cal.c文件将会以C编译方式进行,由于C++支持函数重载而C语言不支持函数重载,所以以上源码可以直接编译可以通过,而一旦把extern“C”注释去掉,便会编译失败。
3互调操作
上面小哥画了一张互调的简图,并分别解释一下:
1)C++编译器通过extern “C”即可直接调用以C方式编译的库文件,最终与其他文件一起编译成为一个可执行文件。
2)C++编译器首先将模块用extern “C”方式编译好,C编译器直接拿了该模块文件与其他文件一起编译生成可执行文件。
4小技巧
在C++编译器内部一般都会内置__cplusplus这样一个宏定义,那么我们可以通过使用该宏来设置一个预编译结构,当在C++编译器下就使用extern “C”编译C模块代码,否则就剔除,相信大家在一些库文件中经常看到。
#ifdef__cplusplus extern"C" { #endif //fuctiondefinitionordeclaration #ifdef__cplusplus } #endif
责任编辑:xj
原文标题:C代码与C++互相调用的小技巧
文章出处:【微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。
-
C语言
+关注
关注
180文章
7617浏览量
138211 -
C++
+关注
关注
22文章
2114浏览量
73987 -
代码
+关注
关注
30文章
4846浏览量
69296
原文标题:C代码与C++互相调用的小技巧
文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
源代码加密、源代码防泄漏c/c++与git服务器开发环境

Spire.XLS for C++组件说明

AKI跨语言调用库神助攻C/C++代码迁移至HarmonyOS NEXT
同样是函数,在C和C++中有什么区别
C++中实现类似instanceof的方法

SEGGER编译器优化和安全技术介绍 支持最新C和C++语言

C/C++中两种宏实现方式
使用 MISRA C++:2023® 避免基于范围的 for 循环中的错误

为什么很少用C++开发单片机

C语言#define的应用

评论