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

时间:2011-11-01 13:13:14

标签: c++ visual-c++ while-loop assert

我正在审核一个代码库,其中assert宏在非调试配置中展开如下:

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

我不太了解。显然,目标是实现无操作。那为什么不扩展成空字符串?

#define assert( what )

这种无操作循环的原因是什么?

2 个答案:

答案 0 :(得分:3)

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

if (foo);

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

if (foo) assert(what);

C99(与C ++ 11相关)也表示assert扩展为“void表达式”。 IIRC,单独的空格不是表达式,即使后跟分号的空格是表达式语句。好旧的BNF语法。

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

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

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

答案 1 :(得分:2)

最有可能吞噬分号。是否需要 - 我不认为它会产生太大的影响,但与此同时,它也不会伤害任何东西。