Windows MSYS2编译XC32交叉编译器时abort宏定义报错的解决方法
问题原因分析
- Windows MSYS2 UCRT64环境下,UCRT(通用C运行时)已将
abort预定义为宏,和自定义的#define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__)产生命名冲突;而Ubuntu的glibc中abort是普通函数,无预定义宏,因此gcc 11.4.0可正常编译。 - gcc 13.2.0对C++模板中的宏展开语法检查更严格,当模板类调用
abort()时,宏展开后的代码在Windows平台的语境下,编译器无法正确解析__FUNCTION__与模板上下文的结合,触发语法错误。
解决方法
- 取消系统预定义的
abort宏后再自定义:#ifdef abort #undef abort #endif #define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__) - 修改自定义宏的名称,避免冲突,比如将
abort()改为xc32_abort(),同时替换所有代码中调用abort()的位置。 - 调整宏的写法以兼容C++模板,使用
do-while(0)结构确保宏的语法安全性:#define abort() do { fancy_abort(__FILE__, __LINE__, __FUNCTION__); } while(0)
内容的提问来源于stack exchange,提问作者Gabriel Staples
相关产品推荐
相关产品推荐

