Dans un coding style question about infinite loops, certaines personnes ont mentionné qu'elles préféraient le style for (;;) car le style while (true) donnait des messages d'avertissement sur MSVC à propos d'une expression conditionnelle constante. Cela m'a beaucoup surpris, car l'utilisation de valeurs constantes dans les expressions conditionnelles est un moyen utile d'éviter #ifdef l'enfer. Par exemple, vous pouvez avoir dans votre tête:Valeur constante dans l'expression conditionnelle
#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 de elide le code mort quand CONFIG_FOO n'est pas défini:
if (foo_enabled) {
...
}
Au lieu de avoir à tester CONFIG_FOO chaque fois foo_enabled est utilisé:
#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 AMRC os à 1 ou 0 lorsque SMP est désactivé et à un appel de fonction lorsque SMP est activé).
Quelle est la raison de cet avertissement MSVC? De plus, 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?
Bon point. C'est une raison pour laquelle on voit des comparaisons "en arrière" comme "if (0 == x)" - si vous ratez one = sign, le compilateur l'attrape! – bog
Si c'est ce qu'il veut attraper, ne pourrait-il pas attraper seulement cela (assignation dans un conditionnel) au lieu d'un avertissement plus général? – CesarB
Cela génère un avertissement différent. Avec VC++, c'est: Compiler Warning (niveau 4) Affectation C4706 dans une expression conditionnelle – Ferruccio