Question

Dans une question sur le style de codage à propos des boucles infinies , certaines personnes ont indiqué préférer la for (car; style) car le style while (true) donne des messages d'avertissement sur MSVC indiquant qu'une expression conditionnelle est constante.

Cela m’a beaucoup surpris, car l’utilisation de valeurs constantes dans les expressions conditionnelles est un moyen utile d’éviter l’enfer #ifdef. Par exemple, vous pouvez avoir dans votre en-tête:

#ifdef CONFIG_FOO
extern int foo_enabled;
#else
#define foo_enabled 0
#endif

Et le code peut simplement utiliser un conditionnel et faire confiance au compilateur pour éliminer le code mort lorsque CONFIG_FOO n'est pas défini:

if (foo_enabled) {
    ...
}

Au lieu de tester CONFIG_FOO à chaque utilisation de foo_enabled:

#ifdef CONFIG_FOO
if (foo_enabled) {
    ...
}
#endif

Ce modèle de conception est utilisé tout le temps dans le noyau Linux (par exemple, include / linux / cpumask.h définit plusieurs macros sur 1 ou 0 lorsque SMP est désactivé et sur un appel de fonction lorsque SMP est activé).

Quelle est la raison de cet avertissement MSVC? En outre, existe-t-il un meilleur moyen d'éviter l'enfer #ifdef sans avoir à désactiver cet avertissement? Ou est-ce un avertissement trop large qui ne devrait pas être activé en général?

Était-ce utile?

La solution

Un avertissement ne signifie pas automatiquement que le code est mauvais , mais plutôt suspect.

Personnellement, je commence par activer tous les avertissements possibles, puis désactive ceux qui se révèlent plus gênants qu'utiles. Celui qui se déclenche chaque fois que vous lancez quelque chose en bool est généralement le premier à partir.

Autres conseils

Je pense que la raison de cet avertissement est que vous pourriez, par inadvertance, avoir une expression plus complexe qui aboutit à une constante sans vous en rendre compte. Supposons que vous ayez une déclaration comme celle-ci dans un en-tête:

const int x = 0;

puis plus tard, loin de la déclaration de x, vous avez une condition comme:

if (x != 0) ...

Vous pourriez ne pas remarquer que c'est une expression constante.

Je crois que c'est pour attraper des choses comme

 if( x=0 )

quand vous vouliez dire

 if( x==0 )

Un moyen simple d'éviter l'avertissement serait:

#ifdef CONFIG_FOO
extern int foo_enabled;
#else
extern int foo_enabled = 0;
#endif
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top