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

    文章

    7617

    浏览量

    138211
  • C++
    C++
    +关注

    关注

    22

    文章

    2114

    浏览量

    73987
  • 代码
    +关注

    关注

    30

    文章

    4846

    浏览量

    69296

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

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

收藏 人收藏

    相关推荐

    源代码加密、源代码防泄漏c/c++与git服务器开发环境

    源代码加密对于很多研发性单位来说是至关重要的,当然每家企业的业务需求不同所用的开发环境及开发语言也不尽相同,今天主要来讲一下c++及git开发环境的源代码防泄密保护方案。企业源代码泄密场景一、在很多
    的头像 发表于 02-12 15:26 227次阅读
    源代码加密、源代码防泄漏<b class='flag-5'>c</b>/<b class='flag-5'>c++</b>与git服务器开发环境

    Spire.XLS for C++组件说明

    Spire.XLS for C++ 是一款专业的 C++ Excel 组件,可以用在各种 C++ 框架和应用程序中。Spire.XLS for C++ 提供了一个对象模型 Excel
    的头像 发表于 01-14 09:40 212次阅读
    Spire.XLS for <b class='flag-5'>C++</b>组件说明

    EE-128:C语言中的DSP:从C调用汇编类成员函数

    电子发烧友网站提供《EE-128:C语言中的DSP:从C调用汇编类成员函数.pdf》资料免费下载
    发表于 01-07 13:48 0次下载
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>语言</b>中的DSP:从<b class='flag-5'>C</b><b class='flag-5'>调用</b>汇编类成员函数

    AKI跨语言调用库神助攻C/C++代码迁移至HarmonyOS NEXT

    /C++代码快速迁移至HarmonyOS NEXT。凭借卓越的兼容性,AKI已成为厂商与开发者打造鸿蒙原生应用过程中广泛使用的跨语言调用解决方案。 AKI是一款专为鸿蒙原生开发设计的FFI(外部函数接口
    发表于 01-02 17:08

    同样是函数,在CC++中有什么区别

    同样是函数,在 CC++ 中有什么区别? 第一个返回值。 C语言的函数可以不写返回值类型,编译器会默认为返回 int。 但是 C++
    的头像 发表于 11-29 10:25 488次阅读

    C语言C++中结构体的区别

    同样是结构体,看看在C语言C++中有什么区别?
    的头像 发表于 10-30 15:11 392次阅读

    C7000优化C/C++编译器

    电子发烧友网站提供《C7000优化C/C++编译器.pdf》资料免费下载
    发表于 10-30 09:45 0次下载
    <b class='flag-5'>C</b>7000优化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>编译器

    C++语言基础知识

    电子发烧友网站提供《C++语言基础知识.pdf》资料免费下载
    发表于 07-19 10:58 8次下载

    C++中实现类似instanceof的方法

    C++有多态与继承,但是很多人开始学习C++,有时候会面临一个常见问题,就是如何向下转型,特别是不知道具体类型的时候,这个时候就希望C++ 可以向Java或者Python中有instanceof这个
    的头像 发表于 07-18 10:16 700次阅读
    <b class='flag-5'>C++</b>中实现类似instanceof的方法

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

    SEGGER编译器是专门为ARM和RISC-V微控制器设计的优化C/C++编译器。它建立在强大的Clang前端上,支持最新的CC++语言
    的头像 发表于 06-04 15:31 1576次阅读
    SEGGER编译器优化和安全技术介绍 支持最新<b class='flag-5'>C</b>和<b class='flag-5'>C++</b><b class='flag-5'>语言</b>

    C/C++中两种宏实现方式

    #ifndef的方式受C/C++语言标准支持。它不仅可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。
    的头像 发表于 04-19 11:50 730次阅读

    鸿蒙OS开发实例:【Native C++

    使用DevEco Studio创建一个Native C++应用。应用采用Native C++模板,实现使用NAPI调用C标准库的功能。使用C
    的头像 发表于 04-14 11:43 2842次阅读
    鸿蒙OS开发实例:【Native <b class='flag-5'>C++</b>】

    使用 MISRA C++:2023® 避免基于范围的 for 循环中的错误

    在前两篇博客中,我们 向您介绍了新的 MISRA C++ 标准 和 C++ 的历史 。在这篇博客中,我们将仔细研究以 C++ 中 for 循环为中心的特定规则。
    的头像 发表于 03-28 13:53 895次阅读
    使用 MISRA <b class='flag-5'>C++</b>:2023® 避免基于范围的 for 循环中的错误

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

    C语言是面向过程的语言C++是面向对象的编程语言。结合本文来说,面向过程相比面向对象的编程,生成代码量(bin文件)更小,运行效率更高。
    发表于 03-25 14:26 1214次阅读
    为什么很少用<b class='flag-5'>C++</b>开发单片机

    C语言#define的应用

    C/C++ 编程语言中,当程序被编译时,被发送到编译器,编译器将程序转换为机器语言,然后完成编译并执行该程序。预处理器也称为宏预处理器。
    发表于 03-06 11:29 445次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>#define的应用