なぜ #define assert(expression) ((void)0)
、 はなく #define assert(expression)
はリリースモードで使用されていますか?(NDEBUGが定義されている場合、厳密に言えば)なぜassertは(void)0と定義されていますか?
私はいくつかの理由があると聞いたが、私はそれを忘れてしまったしました。
なぜ #define assert(expression) ((void)0)
、 はなく #define assert(expression)
はリリースモードで使用されていますか?(NDEBUGが定義されている場合、厳密に言えば)なぜassertは(void)0と定義されていますか?
私はいくつかの理由があると聞いたが、私はそれを忘れてしまったしました。
((void)0)
は、何もしないことを定義します(assert(expression)
)。それを使用する
主な理由は、#define assert(expression)
がassert(expression)
はセミコロンなしでコンパイルできるようになるが、マクロが((void)0)
がempty macros
に使用されている理由は、彼らは関数のように動作させるです((void)0)
'#define assert(expr)'との違いは何ですか? – RedX
として定義されている場合、それはコンパイルされませんということです、あなたが例えばエンド
にセミコロン;
を指定する必要がある意味で:;その後、 `、およびアサートは何になっていない場合は、その孤独は残り
#define assert1(expression) (void)0
assert(1) // compile error, missing ;
#define assert2(expression)
assert(1) // works
'は通常あり';'は警告を発する可能性があります。 –
後者は 'assert(true)'(セミコロンなし)を許可しますが、前者は許可しません。 –
@MarcGlisse答えとして投稿する必要があります。今のところ、あなたのコメントはポスターの質問に実際に答える唯一のステートメントです。 – axiac