Compartir vía


Advertencia del compilador (nivel 4) C4127

la expresión condicional es constante

Comentarios

La expresión de control de una instrucción if o un bucle while se evalúa como una constante. Debido a su uso idiomático común, a partir de Visual Studio 2015 Update 3, constantes triviales como 1 o true no desencadenan la advertencia, a menos que sean resultado de una operación en una expresión.

Si la expresión de control de un bucle while es una constante porque el bucle sale en el centro, considere la posibilidad de reemplazar el bucle while por un bloque for. Puede omitir la inicialización, la prueba de terminación y el incremento de un bucle for, lo que provocará un bucle infinito (como while(1)) y puede salir del bucle desde el cuerpo de la instrucción for.

Ejemplo

En el ejemplo siguiente, se muestran dos maneras de generar la advertencia C4127 y se muestra cómo usar un bucle for para evitar la advertencia:

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

Esta advertencia también se puede generar cuando se usa una constante en tiempo de compilación en una expresión condicional:

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