Предупреждение компилятора (уровень 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>();
}