当前位置: 首页 > news >正文

【Keil】C/C++混合编程的简单方法

目录

前言:

一、在.c文件中添加C++代码

    1、在cpp文件中定义C类型的接口函数

    2、在C类型的接口函数内引用C++类型的封装好的函数接口API

    3、在main.c文件中声明并调用C类型的接口函数

二、在.cpp文件中添加C代码

三、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~


前言:

        C语言的高效性是其核心优势之一,可以直接操作硬件(如寄存器、内存地址),生成的机器码更接近底层,执行效率高,是Keil的标准语言。

        C++性能接近C语言,但功能更加丰富,其三大特性——多态、继承、封装可以帮助开发者实现更加丰富的功能,尤其适合大型项目开发。

        由于C语言和C++在编译规则、符号命名方式、函数调用约定等方面存在本质差异,导致两者之间无法直接调用,例如:C语言中的func函数在编译后会直接被保留为符号名func,但由于C++支持函数重载,允许多个函数使用相同名称,所以C++中的函数在编译后会自动生成对应当前函数的唯一符号名以便于区分,这就是两者不能直接互相调用的原因之一。

        但是我们在keil中创建源文件时主函数都是main.c文件,那么如何在.c文件中使用C++环境下定义的函数和类呢?请看下文:

一、在.c文件中添加C++代码

        在.c文件中添加C++代码主要包括三个步骤:

    1、在cpp文件中定义C类型的接口函数

        首先,我们需要创建一个独立于main.c之外的user_main.cpp文件(只要是.cpp文件就行,叫什么名字都可以),在文件中定义C类型的接口函数和C++的类实例,使得C和C++风格的代码在同一文件内相互可见。

        user_main.cpp文件内容示例如下所示:

#include "CSystem.h"		//包含C++实现类的头文件,以引出CSystem类
static CSystem MyCppClass;	//定义C++风格的CSystem类静态实例 m_theApp#if defined(__cplusplus)	//如果当前处在C++环境
extern "C" {				//使用extren "C" { 定义C风格函数,使其在C名称空间内可见
#endifvoid User_Init(void)		//定义C风格初始化接口函数
{MyCppClass.bInit();		//调用C++类实例m_theApp中实现的初始化函数API
}void User_Task(void)		//定义C风格任务接口函数
{MyCppClass.vRun();		//调用C++类实例m_theApp中实现的任务函数API
}#if defined(__cplusplus)
}							//使用 } 来结束定义C风格的函数
#endif

    2、在C类型的接口函数内引用C++类型的封装好的函数接口API

        详见上部分中的User_Init(void)函数和User_Task(void)函数内容,里面引用的就是C++的CSystem 类实例中的成员函数。

    3、在main.c文件中声明并调用C类型的接口函数

        main.c文件中的main函数,是项目代码的入口,在这里调用C++代码,最终实现C和C++两种风格编程语言的融合。main.c文件内容示例如下所示:

#include "main.h"void SystemClock_Config(void);	//时钟初始化函数前置声明void User_Init(void);	        //  C/C++混合编程接口初始化函数前置声明
void User_Task(void);			//  C/C++混合编程接口任务函数前置声明int main(void)
{HAL_Init();			//HAL库初始化SystemClock_Config();	//系统时钟初始化MX_GPIO_Init();		//进行外设初始化User_Init();	        //C类型的混合编程接口初始化函数,在其中调用C++实现的初始化接口函数while (1){User_Task();		//C类型的混合编程接口任务执行函数,循环调用C++类中实现的任务函数}
}

二、在.cpp文件中添加C代码

        在C++中使用C比较简单,只需要在.cpp文件中使用 extren “C”{} 来将C类型的函数进行声明定义就可以,然后就可以在函数定义的文件范围内,正常调用C类型的函数,来实现具体功能,我们所熟知的中断回调函数就是一个很好的例子:

extern "C" 
{void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin){switch(GPIO_Pin)		{case GPIO_PIN_2:{INTIsReady = TRUE;	//更新数据就绪标志位}	break;default:break;}}
}

三、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~


文章转载自:
http://agenda.alwpc.cn
http://cherry.alwpc.cn
http://canopy.alwpc.cn
http://ballistocardiogram.alwpc.cn
http://aphanitic.alwpc.cn
http://batrachian.alwpc.cn
http://ampoule.alwpc.cn
http://brix.alwpc.cn
http://bortsch.alwpc.cn
http://bestrow.alwpc.cn
http://apomict.alwpc.cn
http://chalicothere.alwpc.cn
http://chemotropically.alwpc.cn
http://balneation.alwpc.cn
http://chaldaic.alwpc.cn
http://bryozoan.alwpc.cn
http://angiotomy.alwpc.cn
http://blasted.alwpc.cn
http://cantorial.alwpc.cn
http://admitted.alwpc.cn
http://cantrail.alwpc.cn
http://catalytic.alwpc.cn
http://arboriculture.alwpc.cn
http://chat.alwpc.cn
http://anthropolatry.alwpc.cn
http://amchitka.alwpc.cn
http://bloodshed.alwpc.cn
http://caladium.alwpc.cn
http://blowup.alwpc.cn
http://amberoid.alwpc.cn
http://www.dtcms.com/a/281208.html

相关文章:

  • DGNNet:基于双图神经网络的少样本故障诊断学习模型
  • 深入浅出 RabbitMQ-核心概念介绍与容器化部署
  • Element plus参考vben逻辑实现的描述列表组件封装实践
  • 【PTA数据结构 | C语言版】二叉树前序序列化
  • 差分信号接口选型指南:深入解析LVDS、SubLVDS、SLVDS与SLVDS-EC**
  • 《大数据技术原理与应用》实验报告五 熟悉 Hive 的基本操作
  • [AI8051U入门第三步]串口1使用-printf重定向(乱码解决办法)
  • Django+Celery 进阶:动态定时任务的添加、修改与智能调度实战
  • Android target34升级到35中的edge-to-edge适配
  • Nestjs框架: 数据库架构设计与 NestJS 多 ORM 动态数据库应用与连接池的配置
  • 利用android studio,对图片资源进行二次压缩
  • 基于Ruoyi和PostgreSQL的统一POI分类后台管理实战
  • 三步把餐饮回访差评变口碑
  • java+vue+SpringBoot在线租房和招聘平台(程序+数据库+报告+部署教程+答辩指导)
  • Ajax原理、用法与经典代码实例
  • TCP协议可靠性设计的核心机制与底层逻辑
  • 基于YOLOv8的水稻叶片病害检测系统的设计与实现【近6W条数据集+多病害特征+高准确率】
  • 修改系统配置后,如何编写 Python 脚本以适应 SSL 证书验证的变化
  • Axios 和 Promise 区别对比
  • C语言---自定义类型(下)(枚举和联合类型)
  • 利用DeepSeek为chdb命令行客户端添加输出重定向和执行SQL脚本功能
  • nlp论文:分本分类:《Bag of Tricks for Efficient Text Classification》
  • VirtualBox网络配置全指南:桥接、Host-Only与双网卡实战
  • 2025华为ODB卷-士兵过河-三语言题解
  • 限制apk使用时长第二篇-限制/拦截Apk启动-应用锁功能
  • 创客匠人:创始人 IP 变现,从 “单点尝试” 到 “生态赋能” 的跨越
  • S7-200 SMART PLC:不同CPU及数字量 IO 接线全解析
  • ESLint 配置错误:ReferenceError: prettier is not defined 解决方案
  • 运维技术教程之Jenkins上的known_hosts文件
  • 高频高密度趋势下磁芯材料评价指标探讨