我正在审核一个代码库,其中assert
宏在非调试配置中展开如下:
#define assert( what ) while( 0 )( ( void )1 )
我不太了解。显然,目标是实现无操作。那为什么不扩展成空字符串?
#define assert( what )
这种无操作循环的原因是什么?
答案 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)
最有可能吞噬分号。是否需要 - 我不认为它会产生太大的影响,但与此同时,它也不会伤害任何东西。