Udostępnij przez


Ostrzeżenie kompilatora (poziom 4) C4127

wyrażenie warunkowe jest stałe

Uwagi

Wyrażenie sterujące instrukcji if lub while pętli daje w wyniku stałą. Ze względu na ich typowe idioatyczne użycie, począwszy od programu Visual Studio 2015 update 3, trywialne stałe, takie jak 1 lub true nie wyzwalają ostrzeżenia, chyba że są wynikiem operacji w wyrażeniu.

Jeśli wyrażenie while sterujące pętli jest stałą, ponieważ pętla kończy się w środku, rozważ zastąpienie while pętli pętlą pętlą for . Można pominąć inicjację, test zakończenia i przyrost for pętli pętli, co powoduje nieskończoność pętli, podobnie jak while(1), i można zamknąć pętlę z treści for instrukcji.

Przykłady

W poniższym przykładzie przedstawiono dwa sposoby generowania C4127 i pokazano, jak używać pętli for, aby uniknąć ostrzeżenia:

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

To ostrzeżenie można również wygenerować, gdy stała czasu kompilacji jest używana w wyrażeniu warunkowym:

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