質問

オプションでいくつかの情報を記録するために、いくつかのプリプロセッサマクロでコーディングしたいです。たとえば、.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)に変換されます。空のステートメントの代わりに。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top