我有相当多的代码编写在各种构建系统下编译(例如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闭嘴的东西,它甚至不应该解析的建议?我找不到一个标志来关闭这个警告
我在xc8中使用宏,但使用#if而不仅仅是#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
这样我就不会无意中生成为错误选项(或没有)编译的代码