4

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

何か理由があると聞いたのですが忘れてしまいました。

4

2 に答える 2

3

((void)0)assert(expression)何もしないことを定義します。
これを使用する主な理由は、セミコロンなしでコンパイル#define assert(expression)できるようassert(expression)にするためですが、マクロが次のように定義されている場合はコンパイルされません。((void)0)

于 2016-03-31T09:27:46.373 に答える
2

((void)0)で使用される理由は、最後empty macrosにセミコロンを指定する必要があるという意味で、関数のように動作させるためです。;

例えば:

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

#define assert2(expression) 
     assert(1) // works
于 2016-03-31T09:41:42.647 に答える