2013-08-14 9 views
6

このコードがコンパイルされないのはなぜですか?私が正しく理解すれば、これはコンパイルするべきです。どこが間違っている?プリプロセッサはプリプロセッサディレクティブの理解

#if THREADMODEL==NOASC 

を解釈するとき

#define THREADMODEL ASC 

#if THREADMODEL==NOASC 
THIS BLOCK SHOULDN'T BE COMPILED 
#endif 

int main() { 
} 

答えて

13

それはASCTHREADMODELを置き換えます:

#if ASC==NOASC 

をあなたが数値を持つように#define D ASCNOASCを持っている場合を除き、プリプロセッサは、それらを交換します0の値を持ちます(未定義シンボルをすべて取り、0に置き換えます)。

#if 0==0 

これは、1と評価され、プリプロセッサはそのブロックを評価します。この問題を解決するには

、このように、ASCNOASCに異なる数値を与えてみてください:

#define ASC 0 
#define NOASC (1 + (ASC)) 

は、この情報がお役に立てば幸い!

+0

ありがとうございます!素晴らしい答え! –

+0

式に展開されるマクロ定義を完全にかっこで囲むことをお勧めします: '#define NOASC(1 + ASC)' –

+0

@KeithThompson良いキャッチ - 結果の式ではなく 'ASC'を括弧で囲むことを思い出しました。 – templatetypedef

関連する問題