2016-03-31 16 views
4

なぜ #define assert(expression) ((void)0)、 はなく #define assert(expression) はリリースモードで使用されていますか?(NDEBUGが定義されている場合、厳密に言えば)なぜassertは(void)0と定義されていますか?

私はいくつかの理由があると聞いたが、私はそれを忘れてしまったしました。

+5

'は通常あり';'は警告を発する可能性があります。 –

+0

後者は 'assert(true)'(セミコロンなし)を許可しますが、前者は許可しません。 –

+3

@MarcGlisse答えとして投稿する必要があります。今のところ、あなたのコメントはポスターの質問に実際に答える唯一のステートメントです。 – axiac

答えて

2

((void)0)は、何もしないことを定義します(assert(expression))。それを使用する
主な理由は、#define assert(expression)assert(expression)はセミコロンなしでコンパイルできるようになるが、マクロが((void)0)empty macrosに使用されている理由は、彼らは関数のように動作させるです((void)0)

+0

'#define assert(expr)'との違いは何ですか? – RedX

1

として定義されている場合、それはコンパイルされませんということです、あなたが例えばエンド

にセミコロン;を指定する必要がある意味で:;その後、 `、およびアサートは何になっていない場合は、その孤独は残り

#define assert1(expression) (void)0 
    assert(1) // compile error, missing ; 

#define assert2(expression) 
    assert(1) // works 
関連する問題