Avviso del compilatore (livello 4) C4127
espressione condizionale costante
Osservazioni:
L'espressione di controllo di un'istruzione if
o di un ciclo while
restituisce una costante. A causa dell'utilizzo idiomatico comune, a partire da Visual Studio 2015 update 3, costanti semplici come 1 o true
non attivano l'avviso, a meno che non siano il risultato di un'operazione in un'espressione.
Se l'espressione di controllo di un while
ciclo è una costante perché il ciclo viene chiuso al centro, è consigliabile sostituire il while
ciclo con un for
ciclo. È possibile omettere l'inizializzazione, il test di terminazione e l'incremento del ciclo di un for
ciclo, che fa sì che il ciclo sia infinito, proprio come while(1)
, ed è possibile uscire dal corpo dell'istruzione for
.
Esempio
L'esempio seguente illustra due modi in cui viene generato C4127 e illustra come usare un ciclo for per evitare l'avviso:
// 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;
}
}
Questo avviso può essere generato anche quando viene usata una costante in fase di compilazione in un'espressione condizionale:
#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>();
}