打印
[开发资料]

keil中实现c与c++混合编程

[复制链接]
335|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eefas|  楼主 | 2022-9-11 20:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
起因
项目中使用到一个开源的模拟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++文件中需要调用的函数,如图所示
二、在c++头文件修改声明
对所有需要调用的函数添加extern "C"{} 修饰,如图所示

使用特权

评论回复
沙发
Bowclad| | 2022-10-4 19:16 | 只看该作者
面向对象写出代码确实整洁

使用特权

评论回复
板凳
AloneKaven| | 2022-10-5 20:12 | 只看该作者
又学到了

使用特权

评论回复
地板
updownq| | 2022-11-1 09:40 | 只看该作者
在C和C++代码中内联汇编   

使用特权

评论回复
5
earlmax| | 2022-11-1 09:56 | 只看该作者
extern "C"的真实目的是实现类C和C++的混合编程。extern

使用特权

评论回复
6
cashrwood| | 2022-11-1 10:52 | 只看该作者
通常在头文件中使用如下格式: #ifdef__cplusplus extern"C"

使用特权

评论回复
7
sheflynn| | 2022-11-1 11:20 | 只看该作者
extern "C"表示编译生成的内部符号名使用C约定。C++支持函数重载,而C不支持,两者的编译规则也不一样。

使用特权

评论回复
8
backlugin| | 2022-11-1 11:55 | 只看该作者
“C和C++混合编程 extern"C"表示编译生成的内部符号名使用C约定。

使用特权

评论回复
9
mnynt121| | 2022-11-1 14:51 | 只看该作者
extern "C" 告诉链接器,这些头文件中的函数被当做C语言中的函数来处理.

使用特权

评论回复
10
iyoum| | 2022-11-1 16:06 | 只看该作者
汇编与C/C++的混合编程应该看哪些书

使用特权

评论回复
11
jimmhu| | 2022-11-1 16:57 | 只看该作者
objective-c和Cpp怎么混合编程?  

使用特权

评论回复
12
yeates333| | 2022-11-1 18:04 | 只看该作者
C/ C混合编程需要注意些什么

使用特权

评论回复
13
kkzz| | 2022-11-1 19:02 | 只看该作者
当C++文件要用到C语言中的函数代码时,采用下属方法即可:
在C++中的.h文件或.cpp文件中加入下列代码,
#define LINT_ARGS 1
extern "C" {
#include "system.h"
}

使用特权

评论回复
14
sanfuzi| | 2022-11-1 19:55 | 只看该作者
C和C++到底哪个更好               

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

2589

帖子

2

粉丝