这种无操作 while 循环用于断言宏的原因是什么?

What's the reason for this no-op while-loop used for assert macro?

本文关键字:是什么 断言 用于 操作 while 循环      更新时间:2023-10-16

我正在审查一个代码库,其中assert宏在非调试配置中像这样展开:

#define assert( what ) while( 0 )( ( void )1 )

我不太明白。很明显,我们的目标是不做手术。那么为什么不展开成一个空字符串呢?

#define assert( what )

这个无op循环的原因是什么?

最有可能避免编译器警告。检查这段代码是否引发关于空语句的警告:

if (foo);

如果是,那么您是否希望在发布模式下对以下代码发出相同的警告?

if (foo) assert(what);

C99(与c++ 11相关)还说assert展开为"一个空表达式"。在IIRC中,单独的空格不是表达式,即使空格后跟分号是表达式语句。好旧的BNF语法。

顺便说一下,assert的这个定义是不符合标准的。C89和C99都说当NDEBUG被定义时,断言被定义为:

#define assert(ignore) ((void)0)

我不确定作者是否认为这是一个重要的要求,但是一个程序可以例如字符串化宏展开并期望一个特定的结果。

很可能是为了吞下分号。不管是否需要,我认为这不会有太大的区别,但同时,它也不会伤害任何东西。