为什么断言宏的定义在发布版本中不能只是“#define assert(expression) 0”?
Why the definition of the assert macro, in a release build, cannot be just `#define assert(expression) 0`?
这是Visual Studio2019
中assert宏的定义
#ifdef NDEBUG
#define assert(expression) ((void)0)
#else
_ACRTIMP void __cdecl _wassert(
_In_z_ wchar_t const* _Message,
_In_z_ wchar_t const* _File,
_In_ unsigned _Line
);
#define assert(expression) (void)( \
(!!(expression)) || \
(_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
)
#endif
正如您在上面看到的,发布版本中宏断言的定义是
#define assert(expression) ((void)0)
为什么不能只是 #define assert(expression) 0
?
这会阻止使用 assert
作为表达式。所以如果有人(错误地):
a = assert(something);
编译器将在发布和调试版本中抛出错误。
一些编译器可能希望 (void)
强制转换来抑制有关其值未被使用的表达式的警告。
这是Visual Studio2019
中assert宏的定义#ifdef NDEBUG
#define assert(expression) ((void)0)
#else
_ACRTIMP void __cdecl _wassert(
_In_z_ wchar_t const* _Message,
_In_z_ wchar_t const* _File,
_In_ unsigned _Line
);
#define assert(expression) (void)( \
(!!(expression)) || \
(_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
)
#endif
正如您在上面看到的,发布版本中宏断言的定义是
#define assert(expression) ((void)0)
为什么不能只是 #define assert(expression) 0
?
这会阻止使用 assert
作为表达式。所以如果有人(错误地):
a = assert(something);
编译器将在发布和调试版本中抛出错误。
一些编译器可能希望 (void)
强制转换来抑制有关其值未被使用的表达式的警告。