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