只是猜测为什么他们建议使用
do { ... } while(0,0)
结束
do { ... } while(0)
尽管两种方法没有行为差异,且在运行时代价也应该相同。但我猜测静态分析工具在简单情况下由常量控制
while
循环时会报错,而使用
0,0
时则不会。顾客建议的可能只是为了避免从工具中得到大量错误警告。
例如,有时我会遇到想要有一个由常量控制的条件语句的情况,但编译器会发出一个关于条件表达式评估为一个常量的警告。然后我就必须采取一些措施来解决编译器的警告问题(因为我不喜欢有虚假的警告)。您的客户建议是我用过的其中一种方法,可以消除那个警告,但在我的情况下它并不是在控制一个
while
循环,而是用于处理"始终失败"的断言。有时,我会有一段永远不会执行的代码(比如一个 switch 的默认情况),在这种情况下,我可能会有一个总是失败的带有某些消息的断言:
assert( !"We should have never gotten here, dammit...");
但是,我使用的至少一种编译器会发出有关表达式始终评估为false的警告。然而,如果我将其更改为:
assert( ("We should have never gotten here, dammit...", 0));
警告信息消失了,每个人都很高兴。我猜你的客户静态分析工具也会这样认为。请注意,我通常会将这种跳跃操作隐藏在类似宏的东西后面:
#define ASSERT_FAIL( x) assert( ((x), 0))
告诉工具供应商修复问题可能是好事,但也可能存在合理情况,他们确实想要诊断由常量布尔表达式控制的循环。更不用说,即使你成功说服工具供应商做出改变,那也不能帮助你在接下来的一年左右时间内得到真正的解决方案。
(0,0)
看起来像猫头鹰。也许他们认为你的代码需要更多的猫头鹰。 - Steve Jessop0,0
不是一个常量表达式,但0
是。因此,编译器更有可能会对后者发出警告而不是前者。但也更有可能优化掉后者而不是前者,所以我不太明白他们改变后者会有什么收益。 - Johannes Schaub - litb