STM32 Nucleo板C++环境下SWV printf无输出问题求助
STM32 C++环境下SWV无输出问题解决方案
问题根因
C编译器自带名字修饰(Name Mangling)机制用于支持函数重载,你在C环境下定义的_write函数,切换到C环境编译时,函数名会被改写,无法替换标准库中自带的弱定义_write实现,printf调用时仍然走默认输出路径,因此没有SWV输出。
解决方案
给_write函数添加C链接声明,强制编译器用C语言的规则处理该函数的命名,避免名字修饰。
修改后的代码如下:
/* USER CODE BEGIN 0 */ #ifdef __cplusplus extern "C" { #endif int _write(int file, char *ptr, int len) { int DataIdx; for (DataIdx = 0; DataIdx < len; DataIdx++) { ITM_SendChar(*ptr++); } return len; } #ifdef __cplusplus } #endif /* USER CODE END 0 */
如果你的_write函数只在main.cpp中定义,也可以简化写法:
/* USER CODE BEGIN 0 */ extern "C" int _write(int file, char *ptr, int len) { int DataIdx; for (DataIdx = 0; DataIdx < len; DataIdx++) { ITM_SendChar(*ptr++); } return len; } /* USER CODE END 0 */
验证注意事项
- 原有SWV相关配置(Trace异步模式、核心时钟170MHz、端口0开启、时间步功能关闭)无需修改,和C环境保持一致即可
- 若你后续使用C++的
std::cout输出,需要额外适配流输出重载,直接调用printf可以直接正常工作
内容的提问来源于stack exchange,提问作者Olgidos
相关产品推荐
相关产品推荐

