72 votes

Quel est le raisonnement derrière l'introduction des constantes dans les déclarations if?

Je cherchais un exemple de code C ++ pour une interface matérielle avec laquelle je travaille et j'ai remarqué de nombreuses déclarations dans les termes suivants:

 if ( NULL == pMsg ) return rv;
 

Je suis sûr que j'ai entendu des gens dire que mettre la constante au premier plan est une bonne idée, mais pourquoi est-ce le cas? Est-ce juste pour que vous puissiez voir rapidement ce que vous comparez si vous avez une déclaration volumineuse ou y a-t-il autre chose?

10voto

Dan McGrath Points 9839

Il arrête le bogue single = assignation.

Par exemple,

 if ( NULL = pMsg ) return rv;
 

ne pas compiler, où

 if ( pMsg =  NULL) return rv;
 

va compiler et vous donner des maux de tête

8voto

jamesdlin Points 13455

Afin de clarifier ce que j'ai écrit dans certains commentaires, voici une raison de ne pas faire cela dans le code C++.

Quelqu'un écrit une chaîne de classe et décide d'ajouter un opérateur de cast pour const char*:

class BadString
{
public:
   BadString(const char* s) : mStr(s) { }

   operator const char*() const { return mStr.c_str(); }

   bool operator==(const BadString& s) { return mStr == s.mStr; }

   // Other stuff...

private:
   std::string mStr;
};

Maintenant, quelqu'un s'applique aveuglément l' constant == variable "sur la défensive" de programmation de modèle:

BadString s("foo");

if ("foo" == s) // Oops.  This compares pointers and is never true.
{
   // ...
}

C'est, IMO, un problème plus insidieux que accidentel d'affectation parce que vous ne pouvez pas dire à partir du site d'appel que tout ce qui est évidemment faux.

Bien sûr, les véritables leçons sont:

  1. Ne pas écrire votre propre chaîne de classes.
  2. Évitez les opérateurs de transtypage implicite, en particulier lorsque vous faites (1).

Mais parfois, vous avez à traiter avec des tiers Api vous ne pouvez pas contrôler. Par exemple, l' _bstr_t chaîne de caractères de la classe courante sous Windows COM programmation souffre de ce défaut.

7voto

liwp Points 3473

Lorsque la constante est la première, le compilateur vous avertit si vous écrivez accidentellement = plutôt que == puisqu'il est illégal d'attribuer une valeur à une constante.

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