0

我编写了相当多的代码,可以在各种构建系统(例如 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 对它甚至不应该解析的事情闭嘴的建议?我找不到关闭此警告的标志。

4

1 回答 1

0

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

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

于 2018-09-20T12:22:17.313 回答