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

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

3天内不再提示

C与C++混合编程是什么

汽车电子技术 来源:IOT物联网小镇 作者: 道哥 2023-02-14 13:48 次阅读

这篇文章讲解的知识点很“小”,但是在C和C++的混合编程中非常重要。因为我们在写应用程序时,经常利用到第三方的程序。如果我们的代码用C,但是第三方代码是C++;或者我们的代码用C++,而第三方的代码是C,那么在整合的时候就需要仔细一点了。

一、C调用C++中的函数

  1. 被调用C++代码中的头文件(callee.h)

图片

  1. 被调用C++代码中的源文件(callee.cpp)

图片

  1. 被调用C++代码编译成目标文件(callee.o)

图片

知识点:

(1)关于 __cplusplus

编译器使用g++,所有的C++编译器中都会定义宏:__cplusplus,因此在编译callee.h的时候,会把函数声明包裹在extern "C" 中。

(2)关于 extern "C"

CC++编译器,在编译一个函数的时候,编译策略是不同的。C++会对函数的名称进行改写(而且每个C++编译器对于名字改写的规则也是不一样的,甚至同一个编译器的不同版本的名字改写规则也不一样,因此,使用C++时最好用相同的编译器版本对项目中的所有模块进行编译。补充:改写的目的是为了实现C++语言中的函数重载)。



在callee.h中,把函数 cpp_hello 放在 extern "C" 中,意思就是告诉编译器g++: 这个函数是需要被C调用的,请不要对这个函数进行名字改写。



可以通过 nm 指令查看一下目标文件callee.o中的符号:

图片

我们可以多做一个测试:把extern "C"去掉之后,看一下这个函数如何被g++改写了名字:

图片

  1. 主调用C代码中的源文件(caller.c)

图片

  1. 编译主调用C文件,得到可执行文件

图片

知识点:

(1)caller.c在 include “callee.h" 时,gcc编译器中没有定义 __cplusplus 宏,所以 callee.h 中就相当于只有一句话:void cpp_helo();

(2)在调用 cpp_hello()函数时,虽然这个函数是用g++编译的,但是由于使用了 extern "C",所以名字没有被编译器g++改写,也就是说,在callee.o目标文件中,函数的名字就是 "cpp_hello",所以可以顺利的被C代码调用到。

二、C++调用C中的函数

  1. 被调用C代码中的头文件(callee.h)

图片

  1. 被调用C代码中的源文件(callee.c)

图片

  1. 被调用C代码编译成目标文件(callee.o)

图片

知识点:

编译器使用gcc,其中没有定义宏:__cplusplus,因此在编译callee.h的时候,相当于只有一个函数声明。因此函数c_hello在被编译到callee.o目标文件中时,没有被改名。
  1. 主调用C++代码源文件(caller.cpp)

图片

  1. 编译主调用C++文件,得到可执行文件

图片

知识点:

g++在编译callee.h时,由于g++中定义了__cplusplus宏,因此它在调用函数 c_hello时,就会按照C的方式去调用(也就是没有名字改写),所以就能顺利的在callee.o中查找到这个函数。

三、总结

  1. 在C++代码的函数声明时,如果代码会被C程序调用,一定要加上 extern "C"。
  2. 在C代码的函数声明时,如果代码会被C++程序调用,也要加上extern "C"。
  3. 在用C++编程时,最好各模块统一使用相同的编译器,包括版本最好也相同。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    22

    文章

    2104

    浏览量

    73478
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68319
  • 应用程序
    +关注

    关注

    37

    文章

    3240

    浏览量

    57593
收藏 人收藏

    评论

    相关推荐

    STM32CubeMX如何在*.c源文件中使用c++特性?

    开发环境:Visual Studio 2015 + VisualGDB (编译器为arm-eabi GCC 7.2.0)+ STM32CubeMX cc++混合编程情况下,*.c文件
    发表于 04-25 06:15

    Matlab与C/C++ 混合编程技术总结的太棒了

    在工程实践中,用户经常遇到Matlab 与C/C++混合编程的问题。本文基于Matlab 6.5和VC6.0 开发环境,在Windows 平台下就它们之间的混合编程问题进行深入研究并举
    发表于 04-26 06:42

    STM32c/c++混合编程

    在所有使用C++方法的地方加上:#ifdef __cplusplus,如:#ifdef __cplusplusclass LED{};#endif此外,主函数所有#include 的.h文件用
    发表于 08-23 07:47

    ARM汇编与C混合编程的相关资料分享

    慕课电子科技大学.嵌入式系统.第五章.ARM汇编程序设计.ARM汇编与C混合编程0 目录5 ARM汇编程序设计5.3 ARM汇编与C
    发表于 11-09 06:17

    RT-Thread如何实现C\C++混合编译?要在哪里修改GCC的链接脚本?

    RT-Thread的工程要将外部C++的算法程序移植进来混合编译,C++程序有xxx.h,xxx.cpp两个源文件,直接使用build.sh报了很多错误,肯定无法编译!已经做过如下实验:1.目前我
    发表于 03-22 14:41

    C语言和汇编语言混合编程方法和C语言中断处理方法

    C语言和汇编语言混合编程方法和C语言中断处理方法,new
    发表于 01-06 14:36 36次下载

    Matlab与C混合编程汇总

    接受matlab与CC++混合编程的方法案例
    发表于 01-14 16:09 0次下载

    C_与Matlab混合编程在BEAM绘制中的应用_范婵娇

    C_与Matlab混合编程在BEAM绘制中的应用_范婵娇
    发表于 03-19 11:26 0次下载

    基于MSP430单片机C语言和汇编语言混合编程

    基于MSP430单片机C语言和汇编语言混合编程
    发表于 10-12 17:05 18次下载
    基于MSP430单片机<b class='flag-5'>C</b>语言和汇编语言<b class='flag-5'>混合编程</b>

    Matlab与C/C++混合编程接口及应用方法解析

    地提高工程分析计算的效率[2][3]。但与其他高级程序[3]相比,Matlab 程序 是一种解释执行程序,不用编译等预处理,程序运行速度较慢[4]。 C/C++语言是目前最为流行的高级程序设计语言之一[5]。它可对操作系统和应用程序以 及硬件进行直接
    发表于 10-21 10:24 0次下载

    浅谈关于DSP6000中C/C++语言和汇编语言的混合编程的方法

    一、混合编程的方法主要有以下几种: (1)独立编写C语言程序和汇编程序,分别编译形成各自的目标代码块, 然后用连接器将两种模块连接起来。 (2)直接在C/
    发表于 10-24 10:10 1次下载

    ARM Bootloader 的实现C 和 ASM 混合编程

    ARM Bootloader 的实现C 和 ASM 混合编程
    发表于 10-30 09:28 15次下载
    ARM Bootloader 的实现<b class='flag-5'>C</b> 和 ASM <b class='flag-5'>混合编程</b>

    MATLAB和C++混合编程入门资料说明

    为进行MATLAB/C++混合编程,需要安装MATLAB和C++ 编译器。windows环境下通常选择Visual C++(以下简称VC)作为c++
    发表于 01-15 16:12 21次下载
    MATLAB和<b class='flag-5'>C++</b><b class='flag-5'>混合编程</b>入门资料说明

    单片机C语言和汇编语言混合编程实例详解

    单片机C语言和汇编语言混合编程实例详解
    发表于 08-16 09:50 225次下载

    海思AI芯片(Hi3519A/3559A)方案学习(二十一)extern "C"和C/C++混合编程

    本系列为华为海思海思AI芯片(Hi3519A/3559A)方案学习系列之二十一,系列文章请关注海思AI芯片方案学习。作者:ltshan139
    发表于 01-26 18:44 2次下载
    海思AI芯片(Hi3519A/3559A)方案学习(二十一)extern "<b class='flag-5'>C</b>"和<b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>混合编程</b>