【发布时间】:2015-05-13 04:15:34
【问题描述】:
在回复this 帖子时,我建议使用do {...} while(0) 来处理多行宏。
在 MSVC 上,我发现此代码抛出:
warning C4127: conditional expression is constant
为了使代码无警告,我需要选择以下丑陋的替代方案之一:
选项 1
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable:4127)
#endif
code_using_macro_that_generates_C4217;
#ifdef _MSC_VER
#pragma warning(pop)
#endif
选项 2
将我的宏定义为:
#define MULTI_LINE_MACRO do { ... } while(0,0)
或
#define MULTI_LINE_MACRO do { ... } while((void)0,0)
也被一些程序员称为“猫头鹰”,因为(0,0) 看起来像猫头鹰。
选项 3
定义一个不会产生警告的新宏 WHILE_0 并使用它来代替while(0)
问题
我相信所有的选择或多或少都是可怕的。为什么 MSVC 会为看似正确的代码生成此警告,并促使我在代码中添加一些丑陋的内容以保持代码无警告?
我相信条件中的常量表达式是完全有效和有用的,特别是在基于编译器优化代码能力的构造中。
此外,对于这样的代码,我没有得到warning C4127:
void foo(unsigned bar)
{
while (bar >= 0)
;
}
我的问题是:warning C4127: conditional expression is constant 不是完全没用,它不会激发丑陋的代码吗?此警告是否有助于编写更好的代码?
【问题讨论】:
-
@Bathsheba: 但
for(;;)与do{...}while(0)的含义不同!!!! -
删除
pragma和#include "no_sillywarnings_please.h" -
@GiulioFranco:它没有解决
do { ... } while(0)解决的问题。if(foo) for(;;) { ...; break; }; else bar();是语法错误。 -
@BoykoPerfanov
#define ABC(X) {something;}如果调用为:if(cond) ABC(42); else {},编译将失败 -
不,我想这永远不会有帮助。顺便说一句,猫头鹰很可爱。
标签: c++ c visual-c++ c4127