编译器警告(等级 4)C4127

条件表达式是常量

备注

某个 if 语句或 while 循环的控制表达式的计算结果为常量。 根据它们的常见惯用用法,从 Visual Studio 2015 更新 3 开始,1 或 true 等普通常量不会触发警告,除非它们是表达式中某操作的结果。

如果 while 循环的控制表达式是常量,因为循环将在中间退出,请考虑用 for 循环替换 while 循环。 可以省略 for 循环的初始化、终止测试和循环增量,这会导致无限循环(如 while(1)),你可以从 for 语句的正文中退出循环。

示例

以下示例显示生成 C4127 的两种方式,并显示如何使用 for 循环来避免出现该警告:

// C4127.cpp
// compile with: /W4
#include <stdio.h>
int main() {
   if (true) {}           // OK in VS2015 update 3 and later
   if (1 == 1) {}         // C4127
   while (42) { break; }  // C4127

   // OK
   for ( ; ; ) {
      printf("test\n");
      break;
   }
}

在条件表达式中使用编译时常量时,也会生成此警告:

#include <string>

using namespace std;

template<size_t S, class T>
void MyFunc()
{
   if (sizeof(T) >= S) // C4127. "Consider using 'if constexpr' statement instead"
   {
   }
}

class Foo
{
   int i;
   string s;
};

int main()
{
   Foo f;
   MyFunc<4, Foo>();
}