27 votes

Comment surmonter élégamment les avertissements inutiles du compilateur C++ ?

Cette question n'est pas liée à un avertissement spécifique du compilateur, ce qui suit n'est qu'un exemple.

Actuellement, lorsque je veux une boucle qui vérifie une condition de sortie à l'intérieur :

 while( true ) {
    doSomething();
    if( condition() ) {
       break;
    }
    doSomethingElse();
}

Je ne peux pas écrire cela en Visual C++ - cela émettrait un C4127. conditional expression is constant avertissement. Le compilateur me le brandira au visage bien qu'il soit évident que while(true) ne peut pas avoir été écrit accidentellement.

Supposons que je veuille un code qui se compile sans avertissement. Il y a solutions de contournement à mon service.

Première solution est d'utiliser for(;;) mais cela semble stupide - pourquoi voudrais-je cette chose bizarre au lieu d'une idiomatique élégante et concise ? while(true) ? Deuxième solution est d'utiliser #pragma warning( suppress) antes de while( true ) mais elle ajoute une énorme bannière qui est deux fois plus grande que la while La déclaration elle-même. Troisième solution est de désactiver C4127 pour l'ensemble du projet (je l'ai vu faire dans un projet réel) mais alors toutes les instances utiles possibles de C4127 sont également désactivées.

Existe-t-il un moyen élégant de se débarrasser d'un avertissement inutile ?

26voto

J'écrirais for(;;) parce que c'est idiomatique.

Les versions les plus récentes de Visual C++ ne sont pas aussi idiotes que les versions précédentes en ce qui concerne les avertissements. Visual C++ 10.0 compile du code qui utilise <windows.h> au niveau d'alerte 4, aucun avertissement.

Mais si vous voulez désactiver les avertissements stupides de Visual C++, jetez un coup d'œil à mon ancienne version de en-tête anti-sillywarnings qui a été créé avec l'aide de la communauté [comp.lang.c++].

9voto

Mark Byers Points 318575

Je choisirais for(;;) même sans cet avertissement. Ce n'est pas stupide : c'est une boucle sans condition, ce qui est exactement ce que vous voulez exprimer.

Cela me semble plus logique que d'utiliser une boucle while et de tester que true est toujours vrai à chaque tour de boucle (bien sûr, le compilateur optimisera ce test, ce qui n'affectera pas réellement les performances).

6voto

Martin Ba Points 10243

Ce qui pourrait être réalisable plus élégant qu'une seule ligne de :

 #pragma warning ( suppress : 4127 )

( Je ne peux pas. car je suis toujours sous VS2005, où cette méthode est utilisée. ne fonctionne pas pour tous les avertissements .)

Certainement, pour votre cas for(;;) pourrait être l'approche pragmatique, mais en général

Comment surmonter inutile Les avertissements du compilateur C++ de manière élégante ?

Je dirais les désactiver à l'échelle du projet . (il est inutile après tout). Et, pour varier

Comment surmonter faux-positif Les avertissements du compilateur C++ de manière élégante ?

Je dirais, un simple La ligne du préprocesseur semble déjà tout à fait correcte.

3voto

olafure Points 1394

Ma philosophie est que si vous faites en sorte que le compilateur supprime les avertissements, mettez un commentaire et dites pourquoi. Même si vous pensez que c'est stupide. Pragma se démarque et est visible. C'est un bon commentaire dans votre code.

Lorsque vous commencez à sauter les commentaires et à supprimer les avertissements en vous basant sur votre idée de l'absurdité de la situation, vous vous dirigez vers des problèmes potentiels. Une autre personne travaillant sur votre code après un an pourrait le modifier, avoir des problèmes et perdre un temps précieux à le rechercher.

En fait, vous cherchez un moyen de supprimer les avertissements sans avoir besoin de

  • Utiliser pragma
  • Utilisez le code moche
  • Utiliser la suppression à l'échelle du projet

Ce serait une méthode de suppression très cachée.

Si vous n'aimez pas l'aspect de pragma, utilisez

bool alwaysTrue = true; // to prevent compiler warning C4127
while (alwaysTrue) {
    ...
}

0voto

savage309 Points 1

J'utilise while(true, 1) pour supprimer cet avertissement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X