2017-01-23 4 views
0

私は簡単なテストで少し問題があります:私はLOGDEBUGERRORの3レベルのロガーを持っています。コンパイル時には、必要な値の間のビット単位または演算でレベルエラーを定義します。しかし、私が受け取るタイプのメッセージでLEVELをテストしようとすると、間違っています。 5 & 2レベルが定数の場合は1を返しますが、をint変数に入れると、この問題は発生しません。なぜ誰かが知っていますか?ここCまたは#defineとintの間のbitwise

は定義が、これはためlogger.c

printf("level %d\n", LEVEL); 
printf("type %d\n", type); 
int level = LEVEL; 
printf("and %d\n", LEVEL & type); 
printf("and %d\n", level & type); 
printf("and %d\n", 5 & 2); 

結果

level 5 
type 2 
and 1 
and 0 
and 0 
+5

'#define LEVEL LOG | –

+2

赤ちゃんの最初のマクロ:#define LEVEL(LOG | ERROR) –

+0

これらのコメントをよりよく説明するために、プリプロセッサマクロは単純なテキストの置き換えです。 printfは 'printf("と%d \ n "、LOG | ERROR&type);'、 '(LOG | ERROR)&タイプ' –

答えて

2

あなたのマクロ定義である

#define LOG 1 
#define DEBUG 2 
#define ERROR 4 
#define LEVEL LOG | ERROR 

logger.hでありますはカッコが正しくありません。代わりにこれを使用します。

#define LEVEL (LOG | ERROR) 

偽の定義では、ここでprintf文が拡張されます方法です:

printf("and %d\n", LEVEL & type); 

は次のようになります。

printf("and %d\n", LOG | (ERROR & type)); 
:として解析され

printf("and %d\n", LOG | ERROR & type); 

あなたが意図するものではありません。

常にマクロ定義を括弧:拡張

  • 内のすべてのマクロ引数の周り

    • プット括弧は、上記のような優先順位のエラーを防止するために、完全な表現の周りに括弧を置きます。
  • +0

    私はあなたの助言に従います:D。ありがとうございました! – Matoran

    関連する問題