gpt4 book ai didi

c++ - `warning C4127`(条件表达式是常量)有帮助吗?

转载 作者:IT老高 更新时间:2023-10-28 22:15:00 26 4
gpt4 key购买 nike

在回答 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 是不是完全没用,它不会激发丑陋的代码吗?此警告是否有助于编写更好的代码?

最佳答案

我不认为它有用。相反,误报比只有 do .. while(0) 成语还要多。想想像

这样的结构
if(sizeof(long) == 8) { /* ... */ }
if(SOME_CONSTANT_MACRO) { /* ... */ }

前者不能被 #if 指令替换,后者可以,但一些编码风格指南更喜欢 if 版本,因为语法检查仍会针对死代码进行(在其他平台或其他编译时配置上并没有死),有些人觉得它更容易阅读。

警告(标准要求的警告除外,其中大部分应被视为错误)通常针对有效但可能执行超出预期的代码的代码发出。 if(0) 或类似的东西看起来很傻,但看起来除了“语法检查这个否则死的代码”之外的东西不是故意的。这可能会让读者感到困惑,但它是明确的,我不明白这怎么会意外发生。

从到目前为止给出的示例(我还没有让 MSVC 自己测试),似乎警告是针对 C 语言意义上的常量表达式(也就是说,不是可以是常量的东西 - folded 但在语法上不是常量表达式),因此不会为 if(array)if(function) 发出它(例如 gcc - Wall 确实会发出警告,因为它可能是函数调用)。

while(0,0) 更糟糕的是,在我看来,它会触发 gcc -Wall 警告,用于没有边的逗号运算符的左侧-效果,我可以想象偶尔有用的警告(通常很容易避免)。此警告随着 while((void)0,0) 消失。

我建议关闭警告。

关于c++ - `warning C4127`(条件表达式是常量)有帮助吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28985515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com