Поделиться через


Предупреждение компилятора (уровень 4) C4127

условное выражение является константой

Замечания

Управляющее выражение оператора if или цикла while является константой. Из-за их распространенного идиоматического использования, начиная с Visual Studio 2015 с обновлением 3, тривиальные константы, такие как 1 или true не активируют предупреждение, если только они не являются результатом операции в выражении.

Если управляемое выражение while цикла является константой, так как цикл выходит из середины, рассмотрите возможность замены while цикла циклом for . Вы можете пропустить инициализацию, тест завершения и увеличение for цикла, что приводит к бесконечности цикла, как while(1)и вы можете выйти из цикла из текста инструкции for .

Пример

В следующем примере показано два способа создания C4127 и показано, как использовать цикл для предотвращения предупреждения:

// 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>();
}