11

デバッグログについては、私はよく次のようなものを見て使用しました

#ifdef DEBUG
    #define DLOG(fmt, args...) printf("%s:%d "fmt,__FILE__,__LINE__,args)
#else
    #define DLOG(fmt, args...)
#endif

#defineしかし、多くの場所で、2番目がに置き換えられているのを見てきました

#define DLOG(fmt, args...) do {} while (0)

特に、この答えがあり、同じ質問に対するこの他の答えへのコメントは、問題が次のような状況にあることを示唆しています

if (condition)
    DLOG("foo");

私の簡単なテストでは、行の結果のセミコロン自体が条件内のno-opステートメントとして機能することが示唆されています。

どちらか一方が何もないよりdo {} while (0)良いですか?もしそうなら、なぜですか?さらに良いものは他にありますか?

4

3 に答える 3

10

セミコロン自体には2つの欠点があります。

  • マクロのユーザーはセミコロンなしでマクロを記述でき、コンパイラーは文句を言いません。
  • 一部のコンパイラは、セミコロンが迷っている可能性があることについて警告を発行する場合があります。

このdo {} while (0)トリックは、これらの両方の懸念に対処します。

DLOG("foo") // No semicolon

エラーがトリガーされ、コンパイラは「漂遊」セミコロンについて警告しません。

于 2012-07-18T19:57:19.260 に答える
6

別の形式のno-opが必要な理由の説明については、デバッグ印刷用のC#defineマクロを参照してください。エラーが入り込まないように、使用していない場合でも、コンパイラにデバッグ印刷コードを解析させる必要があります。

于 2012-07-18T19:56:28.980 に答える
0

簡単な答えは、do / whileメソッドを使用すると、複数のステートメントを置き換えてもif、質問の場合と同じように単一のステートメントとして使用できるということです。単一の式の置換については、違いはないと思います。

于 2012-07-18T19:55:46.227 に答える