警告 C4127:条件表达式在 cl 命令中是常量

Posted

技术标签:

【中文标题】警告 C4127:条件表达式在 cl 命令中是常量【英文标题】:warning C4127: conditional expression is constant in cl command 【发布时间】:2015-07-03 05:53:24 【问题描述】:
#define Val_MAX 0
int main() 
   if(Val_MAX)
      printf("The value is %d",VALUE_MAX);
   return 0;

当我尝试编译上述程序时,if(VALUE_MAX) 显示警告

条件表达式是常量。

如何解决上述警告?

【问题讨论】:

选择if(Val_MAX)printf 行。现在点击删除键删除它们,只保留return 0;,这就是所有这一切无论如何都会做的。 如果使用 C++ 或 C99 或更高版本,您也可以省略 return 0; @MohitJain 哇,从来不知道c4127 本身存在标签。谢谢。 :-) @SouravGhosh 我为我的问题创建它(害羞) @MohitJain 好吧,这个身材的问题值得它自己的标签。 :-) 【参考方案1】:

在您的代码中,Val_MAX#defined 到 0 的值

if(Val_MAX)

其实是(预处理后可以用gcc -E查看)

if(0)

这没有任何价值。以下printf() 永远不会执行。

FWIW,像if 这样的选择语句需要一个表达式,预期将在运行时对其进行值评估。对于固定值,选择语句没有意义。它最有可能最终成为“始终正确”或“始终错误”的案例。

一种可能的解决方案: [通过选择语句的一些实际用法]

Val_MAX 设为变量,要求用户输入值,然后使用它。伪代码看起来像

#include <stdio.h>

int main(void) 

   int Val_MAX = 0;

   printf("Enter the value of Val_MAX\n");
   scanf("%d", &Val_MAX);

   if(Val_MAX)
      printf("The value is %d",VALUE_MAX);

   return 0;

【讨论】:

@user2931858 不是编译器的问题,是if的用法。【参考方案2】:

您的 preprocessor directive 将替换 VAL_MAX0 它变为

if(0)

所以无论如何它总是错误的,你的printf 不会执行,所以if 条件是没有用的

【讨论】:

以上是关于警告 C4127:条件表达式在 cl 命令中是常量的主要内容,如果未能解决你的问题,请参考以下文章

VS2005下奇怪的“警告C4127:条件表达式是常数”

检查布尔模板参数时摆脱“条件表达式为常数”警告的方法?

如何在 do while(false) 中禁用 C4127 [重复]

为啥在 C for 循环的条件中使用表达式而不是常量?

JSLINT 关于样式的警告或关于条件表达式的错误

为啥整数 == null 在 C# 中是一个有效的布尔表达式?