历史上的今天
返回首页

历史上的今天

今天是:2024年09月26日(星期四)

正在发生

2019年09月26日 | 关于keil中的c语言和c++的混合编程

2019-09-26 来源:eefocus

c语言编程简单,但是对于编写面向对象来说,实在是不方便。

一个工程是很多驱动文件的集合,底层驱动文件一般使用c语言来编写,但是一般数据封装和功能实现使用c++开发会更加方便。


所以在工程中使用c语言和c++混合编程是非常又必要的。


第一步先设置一下keil的c++编译环境,只需设计下面一步即可。




a.h文件:

#ifndef _A_

#define _A_

 

void funA();

 

#endif

 

a.c文件:

#include "a.h"

 

void funA()

{

 

}

 

b.h文件:

#ifndef _B_

#define _B_

class B

{

public:

void funB();

 

 

}

#endif

b.cpp文件:

#include "b.h"

#include "a.h"

void B::funB()

{

funA();

}

 

上面2文件是cpp文件里面调用了c文件的函数,这样显然是行不通的。

我们需要把要调用的函数定义和声明的地方添加   extern “C”

a.h文件:

#ifndef _A_

#define _A_

 

extern “C” void funA();

 

#endif

 

a.c文件:

#include "a.h"

 

extern “C” void funA()

{

 

}

 

这样cpp文件去调用c文件的函数就没有问题了,当然在c文件中去使用cpp文件的对象也是ok的。

c.h文件:

#ifndef _C_

#define _C_

 

extern “C” void funC();

 

#endif

 

c.c文件:

#include "c.h"

#include "b.h"

extern “C” void funC()

{

B a;

a.funB();

}

 

main函数

 

#include "b.h"

 

void main()

{

B a;

a.funB();

}

2018-1-5结

到这里kiel中的c和c++混合编程完成


不过最近我发现了一个bug,那就是stm32的定时器用不了,一用程序就会死掉。目前还不知道是什么原因。


2018-1-6结


结果寻找原因和验证,发现是因为中断函数使用c++编译时无法被找到的,所有导致中断函数指针为不可描述的初始地址


导致程序无法执行(死机)。需要在中断函数前加上 extern "C" 即可。


2018-1-9结


使用c++编译,所有的中断函数都需加上 extern "C"


2018-1-9结


使用c++编译,所有c文件调用的c函数都需加上 extern "C"

推荐阅读

史海拾趣

安美通(APPCON)公司的发展小趣事

随着市场的不断变化和客户需求的升级,安美通意识到只有不断创新才能在竞争中立于不败之地。因此,公司加大了对研发的投入,积极引进高端人才,并与多所高校和研究机构建立了紧密的合作关系。通过持续的技术创新,安美通成功推出了一系列具有自主知识产权的新产品,进一步巩固了其在行业内的领先地位。

BRIGHT公司的发展小趣事

除了无线耳机和太阳能领域,BRIGHT公司还在健康技术领域取得了重要的突破。他们成功筹集了60万美元的资金,用于推动健康技术的持续增长和扩张。这笔资金使得BRIGHT公司能够在其成功的基础上,进一步研发和推广基于科学的认知健康解决方案。他们的产品,如40赫兹灯,无需医生处方即可普遍使用,为广大消费者提供了更加便捷和科学的健康管理方式。

Comtech AHA Corp公司的发展小趣事

Comtech AHA Corp自创立之初,便以技术创新为核心竞争力。公司研发团队不断攻克技术难关,推出了一系列具有自主知识产权的高性能电子产品。其中,一款具有自主知识产权的通信芯片在市场上取得了巨大成功,为公司带来了可观的收益。随着技术的不断迭代升级,Comtech AHA Corp逐渐在电子行业中占据了一席之地。

Auris公司的发展小趣事

Auris公司的创始人Federic Moll博士,被誉为手术机器人之父。他在2007年创立了Auris Health(原名Auris Surgical Robotics),总部位于美国加利福尼亚州圣卡洛斯。Moll博士此前已经成功创办了多家手术机器人企业,其中最为知名的是上市公司Intuitive Surgical,其达芬奇手术机器人技术已在全球范围内广泛应用。Moll博士的深厚技术背景和丰富的创业经验为Auris的起步奠定了坚实的基础。

DBLECTRO公司的发展小趣事

进入21世纪后,随着全球对环保和可持续发展的关注度不断提高,迪贝电子也积极响应这一趋势,将环保和社会责任融入到企业的经营理念中。公司投入大量资金研发更加环保、节能的产品,并积极参与各种环保公益活动。同时,迪贝电子还积极推广绿色制造理念,通过优化生产流程、降低能耗和减少废弃物排放等措施,实现了企业的可持续发展。

BOWEI公司的发展小趣事

2010年,迪贝电子面临了一次重大的市场挑战。随着国内外竞争对手的不断涌入,气体检测及分析仪器市场的竞争日益激烈。为了应对这一挑战,迪贝电子加大了技术创新的力度,积极引进国内外最新的技术和设备,不断提升产品的性能和品质。同时,公司还加强了与客户的沟通和合作,深入了解客户需求,提供个性化的解决方案。这些努力使得迪贝电子在激烈的市场竞争中保持了领先地位。

问答坊 | AI 解惑

给做射频朋友们推荐款微型低功耗可过日本电波法认证的ASK发射模块

  工作电压:3V(2.4-3.6V) 工作电流:14mA   发射强度:10dBm   发射频率:315MHz、433MHz、390MHz 发射天线:18-25mm   工作温度:-20-- +85℃…

查看全部问答>

在wince开发程序遇到了问题,个人判断应该是unicode 编码问题

在wince开发程序遇到了问题,个人判断应该是unicode 编码问题,比如有如下问题; CString a(\"$ABCDE\"); 个人认为a.left(6)应该是=\"$ABCDE\",结果返回值是\"$\",难道CString 不支持unicode?,left函数参数不应该是字符数量吗? 另外希望本人自己 ...…

查看全部问答>

OMAP5912 DMA数据没传到目的地址里面

首先,我用kmalloc(30*sizeof(char),GFP_DMA)分配了两段存储空间,分别作为源地址和目的地址,就是想要通过dma方式把源地址的数据传送到目的地址。 我采用的是信道0,设置了其相应寄存器, (源地址和目的地址寄存器的值是通过 virt_to_phys(mem) ...…

查看全部问答>

请问Altium Designer 6的library里面找不到intel的8031或者8051怎么办

请问Altium Designer 6的library里面找不到intel的8031或者8051怎么办,是去下载个元件库吗???能不能给个有效的链接,,谢谢了.…

查看全部问答>

有用过MAX436这个滤波芯片,进来帮我解决一下问题

我用MAX436对信号进行处理 MAX436的资料看了,但实际上用的时候和理论上相反 想请教一下高手来帮助下 我是按照MAX.PDF文件里的图12那图连接方法,各个参数是与图13的那些参数一样 但出来的信号时衰减的啊 而且,我调节RL,信号的幅值在中心幅 ...…

查看全部问答>

串口并口i2c

串口RS232? 并口是打印机口? 串口能模拟I2C时序进行通讯吗? 为什么大多数都是用打印机口模拟i2c呢?而不用串口呢…

查看全部问答>

精密多圈电位器

求教:精密多圈电位器与DSP连接电路是怎么样的,怎么引出精密多圈电位器的电阻传递给DSP…

查看全部问答>

轻松玩转电源——易电源学习心得

本人在大学学习期间曾经学习过电源设计课程,但是相对于TI公司的“易电源”产品,在没有大量实践经验积累的基础上是很难设计出一款合格的电源的。TI公司所提供的该系列产品,从硬件到软件,使我们可以设计出符合电磁干扰、散热、大电流、高电压等要 ...…

查看全部问答>

芯片内部短路

前些天折腾电路时,发现stm32最小系统板上电源和地之间短路了!感叹之后,开始测查吧。令我十分意外而悲哀的是,两个小时没查出来!我还不至于垃圾到这个份上啊。后来,我终于发现是芯片内部的问题(99和100脚之间)。我把引脚悬起来,依然短路。那 ...…

查看全部问答>