我有相当多的代码可以在不同的构建系统(例如CCS,Visual C,Embarcadero CBuilder,Microchip XCn)下编译。由于不同的编译器定义内联或中断例程的方式不同,因此我使用#if/#elif/#else构造来满足它们的要求。GCC的预处理器文档甚至建议这是#if等的一个很好的用法。
就我的微处理器构建工具而言,CCS编译器家族和XC16 (基于gcc的)可以很好地处理这个问题,但是XC8坚持查看非活动的#if块并生成警告。
例如,代码
#ifdef _COMPILER_CCS
#INT_RDA
void RDA_ISR(void)
#elif defined (_COMPILER_MCHIP_XC16)
void __attribute__((__interrupt__(_ISR_SPECIAL_SAVE), __auto_psv__)) _U1RXInterrupt(void)
#elif defined (_COMPILER_MCHIP_XC8)
void vU1RXInterruptHandler(void)
#else
#error Problem with defines
#endif
{
...
}生成警告
warning: (107) illegal # directive "INT_RDA"有没有人有关于如何让XC8闭嘴的建议,它甚至不应该解析的东西?我找不到关闭此警告的标志。
发布于 2018-09-20 20:22:17
我在xc8中使用宏,但如果不只使用#ifdef,则使用#,因为它有时似乎认为未定义的'C‘宏是简单的0。另外,我从不给编译器选项赋值为0。
有点吓人,但我倾向于这样做:
//#define COMP_OPT 1
//#define COMP_OPT 2
#define COMP_OPT 3然后在代码中
#if ( COMP_OPT == 0 )
#error COMP_OPT NOT DEFINED
#endif
#if ( COMP_OPT == 2 )
{
// code for compile option 2
// blah blah
}
#endif这样,我就不会无意中生成为错误选项(或无选项)编译的代码。
https://stackoverflow.com/questions/32829685
复制相似问题