Pourquoi MSVC génère l’avertissement C4127 lorsque constante est utilisée dans «while» – C

Pour le code,

while(1) { /* ..... */ } 

MSVC génère l’avertissement suivant.

 warning C4127: conditional expression is constant 

La page MSDN de l’avertissement suggère d’utiliser for(;;) au lieu de while(1) . Je me demande quel avantage for(;;) donne et pourquoi il met en garde contre son utilisation constante pendant while ?

Quel drapeau dois-je utiliser sur GCC pour obtenir le même avertissement?

Les conditions constantes sont souvent assez simples. Considère ceci:

 unsigned k; ... while (k>=0) { ... } 

La condition k>=0 serait logique si k était un entier signé, mais pas pour non signé. Un développeur négligent oublie que k a été déclaré non signé et l’utiliserait comme s’il était utilisable comme nombre négatif. Le compilateur essaie de vous aider et vous en avertit et while(1) tombe pour le compilateur dans la même classe de problèmes. for(;;) est préférable car il signifie sans ambiguïté `boucle pour toujours

for(;;) et while (true) sont différents en ce que le premier est un cas spécial défini comme une boucle infinie, tandis que le second est en quelque sorte un abus disant “vrai, toujours”.

L’avertissement vient parce que les boucles infinies quand vous ne les voulez pas sont assez mauvaises, donc vous avertissez que vous pourriez en avoir une au premier signe. Mais en utilisant for(;;) , vous avez à peu près explicitement dit “boucle ceci pour toujours”, et il n’y a rien à mettre en garde.

Je ne pense pas que GCC ait un avertissement équivalent.