为什么断言宏的定义在发布版本中不能只是“#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) 强制转换来抑制有关其值未被使用的表达式的警告。