なぜ
#define assert(expression) ((void)0)
ではなく が
#define assert(expression)
リリース モードで使用されるのですか? (厳密に言えば、NDEBUG が定義されている場合)
何か理由があると聞いたのですが忘れてしまいました。
なぜ
#define assert(expression) ((void)0)
ではなく が
#define assert(expression)
リリース モードで使用されるのですか? (厳密に言えば、NDEBUG が定義されている場合)
何か理由があると聞いたのですが忘れてしまいました。
((void)0)
assert(expression)
何もしないことを定義します。
これを使用する主な理由は、セミコロンなしでコンパイル#define assert(expression)
できるようassert(expression)
にするためですが、マクロが次のように定義されている場合はコンパイルされません。((void)0)
((void)0)
で使用される理由は、最後empty macros
にセミコロンを指定する必要があるという意味で、関数のように動作させるためです。;
例えば:
#define assert1(expression) (void)0
assert(1) // compile error, missing ;
#define assert2(expression)
assert(1) // works