2010-09-07 4 views
5

Lors de l'examen de la base de code Visual C++ j'ai trouvé une chose étrange suivante. Un assert d'exécution (qui est vérifier l'état et jeter une exception si la condition est violée) a été utilisé dans le cas où la condition pourrait être évaluée au moment de la compilation:Une raison d'utiliser un assertion d'exécution au lieu de s'affirmer à la compilation?

assert(sizeof(SomeType) == sizeof(SomeOtherType)); 

clairement le compilateur évaluera la condition et remplacer le code qui sera effectivement soit

assert(true); 

qui ne fait rien ou

assert(false); 

qui émet une exception chaque fois que le contrôle passe par cette ligne.

OMI une assert compilation aurait dû être utilisé à la place pour les raisons suivantes:

  • il exposerait la violation de l'état plus tôt - au moment de la compilation - et
  • il laisserait plus propre (donc plus rapide et plus petit) code machine être émis

On dirait qu'une affirmation à la compilation est la seule bonne chose. Y a-t-il une raison possible de préférer un asserment d'exécution ici?

+3

On dirait un WTF pour moi. – egrunin

+0

'assert' ne lance généralement pas d'exception mais annule le programme. –

+0

Pour l'instant, il n'y a pas d'assertion de compilation standard. Ce fait est assez important, surtout dans les bases de code plus anciennes. –

Répondre

15

Il n'y a aucune raison de préférer une affirmation d'exécution ici. Vous devriez préférer les erreurs de compilation sur les erreurs d'exécution, donc il n'y a jamais de raison, étant donné l'option entre les deux, de choisir une assertion d'exécution. Cependant, si une affirmation statique n'est pas une option (ne connaît pas le concept d'affirmation statique, ne sait pas comment en faire une et n'en a pas une disponible, ou sait en faire une mais n'a pas le temps de), une affirmation d'exécution est la meilleure chose suivante.

Avec C++ 0x, la fonction intégrée static_assert doit mettre fin à toute raison d'utiliser une assertion d'exécution dans laquelle une assertion de compilation fonctionnerait.

4

Nous ne pouvons pas dire sans contexte. Dans le code du modèle, certaines branches peuvent être inaccessibles pour certaines instanciations. Une affirmation au moment de la compilation serait inappropriée, car cela rend toute la fonction malformée. Un assert(<type-dependent expression>) ne fait pas.

E.g. L'assertion ne peut pas être convertie en assertion statique, même si l'assertion d'exécution n'échoue jamais.

+0

Pourquoi ne peut-on pas créer un static_assert? – GManNickG

+0

'assert (std :: numeric_limits :: min <0);' échoue toujours, indépendamment de T. – usta

+0

@usta: commentez-vous l'absence d'un appel de fonction? @ MSalters: Je pense que vous vouliez 'min()' –

Questions connexes