0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言与C++相互调用

strongerHuang 来源:strongerHuang 作者:嵌入式情报局 2021-01-18 11:05 次阅读

1C与C++相互调用

在一个嵌入式系统中大部分的底层和驱动层更多的是采用C语言来进行开发,而上层应用、服务更多的采用C++等高级语言来进行面向对象等方面的开发方式,那么就存在一个上层调用底层接口的问题,比如最常用的C++调用C的接口来完成相应的外设驱动接口。

我们知道C++几乎是完全兼容C的,不同的编译语言都有其自身的一套编译规则,当然C语言与C++的编译规则是不同的,但C++编译器为了兼容C语言相当于兼容了C语言编译方式,而C语言编译器一般就不会去兼容C++的编译方式。

d2761992-58f7-11eb-8b86-12bb97331649.png

所以理论上来说用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互调操作

d299372e-58f7-11eb-8b86-12bb97331649.png

上面小哥画了一张互调的简图,并分别解释一下:

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

    文章

    7528

    浏览量

    128320
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72898
  • 代码
    +关注

    关注

    30

    文章

    4554

    浏览量

    66732

原文标题:C代码与C++互相调用的小技巧

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C/C++代码动态测试工具VectorCAST插桩功能演示#代码动态测试 #C++

    C++代码
    北汇信息POLELINK
    发布于 :2024年04月18日 11:57:45

    OpenHarmony之NAPI框架介绍

    张志成 诚迈科技高级技术专家 NAPI 是什么 NAPI 的概念源自 Nodejs,为了实现 javascript 脚本与 C++库之间的相互调用,Nodejs 对 V8 引擎的 api 做了一层
    发表于 11-23 15:36

    单片机编程语言可以用c++吗?

    单片机编程语言可以用c++吗?
    发表于 11-09 06:40

    嵌入式C/C++语言精华文章集锦

    面对一个人的大型 C/C++程序时,只看其对 struct 的使用情况我们就可以对其编写者的编程经验进行评估。因为一个大型的 C/C++程序,势必要涉及一些(甚至大量)进行数据组合的结
    发表于 09-25 08:00

    如何为原生C++开发设置Android Studio

    意味着使用函数重用代码。 但是,调用函数会增加额外的开销。 为了减少这种开销,编译器利用称为内部函数的内置函数。 编译器将高级编程语言(例如C/C++)中使用的内部函数主要替换为1-1
    发表于 08-17 08:28

    _C_调用函数_第2节

    函数C++
    充八万
    发布于 :2023年08月11日 11:34:59

    ARM C语言扩展资料

    Arm体系结构包含的功能超出了C/C++程序员可使用的操作集。Arm C语言扩展(ACLE)的目的是允许创建可在编译器和Arm架构变体之间移植的应用程序和中间件代码,同时利用Arm架构
    发表于 08-11 07:31

    【开源三方库】Aki:一行代码极简体验JS&C++语言交互

    ,是前端JS与Native C/C++的FFI(Foreign Function Interface 跨语言交互接口)。 Aki ——针对OpenHarmony上提供JS与C/
    发表于 08-07 17:04

    如何为Arm编译Cc++代码

    C++源代码翻译成机器代码的编译器。 •将汇编语言源代码翻译成机器代码的汇编程序。 •一个链接器,用于将多个机器代码模块组合成一个可执行文件。 可用的工具链包括: •Arm编译器6。基于armclang
    发表于 08-02 17:28

    ARM C语言扩展规范

    ARM C语言扩展(ACLE)规范指定源语言扩展和实现C/C++编译器可以实现的选项,以便让程序员更好地利用ARM体系结构。 扩展包括: 
    发表于 08-02 06:27

    C++程式語言 第一章 1-7C++運算式 - 第1节C++程式語言 第一章 1-7C++運算式 -

    编程语言C++
    充八万
    发布于 :2023年07月30日 03:10:00

    C++程式語言 第一章 1-3C++字串和Vector向量 - 第1节C++程式語言 第一章 1-3C

    编程语言C++
    充八万
    发布于 :2023年07月30日 03:08:19

    一起探索C++的世界!

    C++
    YS YYDS
    发布于 :2023年07月07日 19:10:25