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 が解析すべきではないことについて、XC8 を黙らせる方法について提案がある人はいますか? この警告をオフにするフラグが見つかりません。

4

1 に答える 1

0

私は xc8 でマクロを使用しますが、#ifdef だけでなく #if を使用します。これは、未定義の '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 に答える