keil中实现c与c++混合编程(不添加–cpp编译参数)

起因

项目中使用到一个开源的模拟IIC的库,封装的比较好,但是是使用c++写的。于是将其移植到自己的项目中,主要有以下三步操作:

  • 在工程选项中 C/C++中去掉勾选 C99 Mode
  • 在工程选项中 C/C++的Misc Controls 中添加 --cpp11 参数
  • 在工程选项中 Target中去掉勾选 Use MicroLIB
    由于我的项目中大部分为C代码,出现了以下问题。
printf报错

前面一直使用了MicroLIB,去掉勾选后出错。解决方法如下,在main中选择一合适的位置添加以下代码

#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 
void _ttywrch(int ch) //此函数非必须,有报错再加
{
//    ch=ch;
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); 
}
FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
int fputc(int ch ,FILE *F)
{
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); //按照配置自行修改huart1
	return ch;
}

中断函数报错

中断函数涉及汇编代码,必须以c的形式出现,所以所有中断函数得用 extern "C"{} 修饰

freertos中的函数报错

与上面的错误类似,将出错的函数用 extern "C"{} 修饰即可解决

发现的实用方法

通过参考touchgfx生成的代码,发现了一个不需要添加--cpp11 参数的解决方法,具体操作如下。

一、创建一个空白的C文件和头文件

在头文件中定义c++文件中需要调用的函数,如图所示
keil中实现c与c++混合编程(不添加--cpp编译参数)

二、在c++头文件修改声明

对所有需要调用的函数添加extern "C"{} 修饰,如图所示
keil中实现c与c++混合编程(不添加--cpp编译参数)

三、在主函数调用函数

原文链接: https://www.cnblogs.com/chilkings/p/15837496.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    keil中实现c与c++混合编程(不添加--cpp编译参数)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/187516

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 上午11:18
下一篇 2023年2月12日 上午11:18

相关推荐