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++文件中需要調用的函數,如圖所示

二、在c++頭文件修改聲明

對所有需要調用的函數添加extern "C"{} 修飾,如圖所示

三、在主函數調用函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM