博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C代码与C++互相调用的小技巧
阅读量:2044 次
发布时间:2019-04-28

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

关注+星标公众,不错过精彩内容

转自 | 嵌入式情报局

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"int main(int argc, char** argv) {  printf("Cal(int): %d\n",Cal(5)); printf("Cal(float): %.5f\n",Cal(1.1f)); return 0;}
//FileName : Cal.c#include "Cal.h" int Cal(int Val){ return Val*Val;}float Cal(float Val){ return Val*Val;}
//FileName : Cal.h#ifndef __CAL_H__#define __CAL_H__//extern "C"//{ int Cal(int Val); float Cal(float Val);//}#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//fuction definition or declaration #ifdef __cplusplus }#endif

------------ END ------------

推荐阅读:

关注微信公众号『嵌入式专栏』,底部菜单查看更多内容,回复“加群”按规则加入技术交流群。

点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

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

你可能感兴趣的文章
Leetcode C++ 剑指 Offer 09. 用两个栈实现队列
查看>>
Leetcode C++《每日一题》20200707 112. 路径总和
查看>>
Leetcode C++ 《第198场周赛-2》 1519. 子树中标签相同的节点数
查看>>
Leetcode C++ 《第199场周赛》
查看>>
Leetcode C++ 《第200场周赛》
查看>>
Leetcode C++ 《第201场周赛》
查看>>
云原生 第十章 应用存储和持久化数据卷:存储快照和拓扑调度
查看>>
云原生 第十一章 应用健康
查看>>
Leetcode C++ 《第202场周赛》
查看>>
云原生 第十二章 可观测性:监控与日志
查看>>
Leetcode C++ 《第203场周赛》
查看>>
云原生 第十三章 Kubernetes网络概念及策略控制
查看>>
《redis设计与实现》 第一部分:数据结构与对象 || 读书笔记
查看>>
《redis设计与实现》 第二部分(第9-11章):单机数据库的实现
查看>>
Leetcode C++《热题 Hot 100-70》23.合并K个升序链表
查看>>
《redis设计与实现》第二部分 (第12章:事件)
查看>>
《redis设计与实现》第二部分 (第13章 客户端)
查看>>
《redis设计与实现》第二部分 (第14章 服务器)
查看>>
《redis设计与实现》第四部分 (第18章 发布与订阅)
查看>>
《redis设计与实现》第四部分 (第19章 事务)
查看>>