1

PCH ファイルに次のマクロがあります。

#ifdef DEBUG
    #define MYLOG(...) NSLog(__VA_ARGS__)
#else
    #define MYLOG(...) MYSERVERLOG(MYObject.enableLogging, __VA_ARGS__)
#endif

#define MYSERVERLOG(iLog, ...) iLog ? NSLog(__VA_ARGS__) : TRUE

ここで、DEBUG=0 と DEBUG=1 のどちらを指定しても、常に最初の句に入ります。しかし、PCH で DEBUG に "ifdef" の代わりに "if" を使用すると、正常に動作しますが、すべての MYLOG ステートメントで "結果を表現していません" という警告が表示されます。

どうすればこの状況から抜け出すことができますか?

4

2 に答える 2

2

DEBUG=0 の場合にのみ警告が表示されると思います。問題は、プリプロセッサを実行した後、コンパイラが次のようなコードを認識することです。

...
MYObject.enableLogging ? NSLog(@"your log",...) : TRUE;
...

コンパイラは、関数が意図したとおりに動作し、結果が役に立たないと仮定して、関数の結果を無視できるようにします。ただし、コード内で三項演算子を使用して値を計算するという問題を経験すると、その計算の結果が必要になることが期待されます。このマクロの結果を決して使用しないことがわかっている場合は、それを void にキャストして無視することができます。

#define MYSERVERLOG(iLog, ...) ((void)(iLog ? NSLog(__VA_ARGS__) : TRUE))

マクロの結果を使用する可能性がある場合は、マクロを使用するたびにキャストを実行して結果を無視するか、警告を受け入れる必要があります。この場合、起こりうる問題を回避するために、マクロを括弧で囲む必要があります。

#define MYSERVERLOG(iLog, ...) (iLog ? NSLog(__VA_ARGS__) : TRUE)
于 2011-08-25T02:05:23.533 に答える
1

あなたがするなら

#define DEBUG 0

または、

#define DEBUG 1

「DEBUG」マクロは次のように定義されています。

#ifdef DEBUG 

DEBUGが定義されているため、常にtrueになります。

2番目の句に入りたい場合は、マクロがまったく定義されていないことを確認する必要があります(つまり、マクロを削除するか、コメントアウトします)。

于 2011-08-25T02:00:42.627 に答える