オプションのロギング用のプリプロセッサデバッグマクロ
-
05-07-2019 - |
質問
オプションでいくつかの情報を記録するために、いくつかのプリプロセッサマクロでコーディングしたいです。たとえば、.h
//#define ML_DEBUG(x) (x) // flip this bit to do the error logging
#define ML_DEBUG(x) (1==1) // flip this bit to silence
.mで次のように実装します:
ML_DEBUG(NSLog(@"Class dealloc: %@", [NSString stringWithCString:object_getClassName(self)]));
コードは、提示したとおりに正常に機能します。しかし、「何もしない」とは思いません。ケースは可能な限り軽量です。私は書くことを期待していた:
//#define ML_DEBUG(x) (x) // flip this bit to do the error logging
#define ML_DEBUG(x) (;) // flip this bit to silence
単独のセミコロンは有効なObjective-Cステートメントであるため、これが機能することを期待していましたが、コンパイラーは私に言っています:
expected expression before ';' token
私の質問は、最も軽量な「何もしない」を選択したかどうかです。ステートメント、 1 == 1
を使用するか、これを行うためのそれほど集中的でない方法があります。それとも、一時的なデバッグログへの私のアプローチ全体が間違っているのでしょうか?
解決
最も簡単なことは空の定義です:
#define ML_DEBUG(x)
これはほとんどの場合に機能しますが、三項演算子では機能しません。例:
something ? ML_DEBUG(x) : ML_DEBUG(y);
この(確かに不自然な)例で動作するために、これを行うことができます:
#define ML_DEBUG(x) ((void)0)
無効にキャストすることは完全に有効です-式の結果を明示的に無視していることをコンパイラに伝えます。
このため、 NDEBUG
が定義されている場合、標準ANSI Cマクロ assert()
は((void)0)
に変換されます。空のステートメントの代わりに。
所属していません StackOverflow