XC8警告:(107)非法#指令“foo”

时间:2015-09-28 18:40:41

标签: preprocessor c-preprocessor conditional-compilation xc8

我有很多代码编写在各种构建系统下编译(例如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关闭它甚至不应该解析的东西?我找不到关闭此警告的标志。

1 个答案:

答案 0 :(得分:0)

我在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

这样,我不会无意间生成为错误选项(或没有)编译的代码