警告 C4127:条件表达式是常量
warning C4127: conditional expression is constant
#define VALUE_MAX 300
int main() {
if(VALUE_MAX)
printf("The value is %d",VALUE_MAX);
return 0;
}
当我尝试编译上述程序时if(VALUE_MAX)
显示警告
条件表达式是常量。
如何解决上述警告?
因为 if 条件总是为真,这是一个常数......
int main()
{
// if(VALUE_MAX)
#ifdef VALUE_MAX
printf("The value is %d",VALUE_MAX);
#endif
return 0;
}
在你的代码中,VALUE_MAX
不是一个变量,它是一个宏。宏可以被视为预处理时的文本替换。所以
if(VALUE_MAX)
翻译成
if (300)
始终为真。它相当于
if(1)
这基本上没有效果。if
条件下的代码块将无条件执行。
编辑:(详细说明以更好地理解)
if
语句称为选择语句。简单if
语句的语法为
if ( expression ) statement
根据expression
的评估,决定是否执行以下statement
(或块)。
如果是您的代码,
if(VALUE_MAX)
始终计算结果为 TRUE。在这种情况下,使用 if
语句是没有意义的。你可以完全摆脱if
语句。
VALUE_MAX 替换为数字,因此条件替换为
if(300)
这总是正确的。
绕过警告的方法:
- 将VALUE_MAX更改为变量
int VALUE_MAX = 300;
- 将条件更改为 ifdef
#ifdef VALUE_MAX
printf("The value is %d",VALUE_MAX);
#endif
你可能想要一个(预)编译时宏"if"(#ifdef
),而不是运行时的"if"(if (…)
):
#define VALUE_MAX 300
int main() {
#ifdef VALUE_MAX
printf("The value is %d", VALUE_MAX);
#endif
return 0;
}
如果您已#define
VALUE_MAX
宏,则将编译 #ifdef
和 #endif
之间的代码。
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 使用自动推导的 lambda 参数作为常量表达式
- 生成提升::hana::set 的常量表达式问题
- 为什么不能用常量表达式声明数组?
- 不是 lambda 函数中的常量表达式
- 函数调用在常量表达式中必须具有常量值
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 关于在需要常量表达式的上下文中使用的glvalue常量表达式的问题
- 生成 constexpr 字符串表,不能产生常量表达式
- 整体模板参数。错误:在常量表达式中使用'this'
- 如何在满足常量表达式的同时将整数传递给指针,传递给 std::array<double、integer>?
- 编译器错误:函数调用在常量表达式中必须有一个常量值
- 错误:'new'不能出现在常量表达式中
- 我可以写出小于 -0.5 两个 ulps 的常量表达式双精度吗?
- 编译器在传递 const 变量时返回错误:模板参数不是常量表达式
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- C++ 使用变量而不是常量表达式初始化数组
- 使用函数参数作为常量表达式的一部分 - gcc vs clang
- 片段着色器中的"错误:在 GLSL 1.30 及更高版本中禁止使用非常量表达式索引的采样器数组"