2010-11-26 36 views
1

Si j'ai quelque chose comme:Appelle à la fonction quels appels s'affirment seront supprimés dans Release ver d'un programme?

static long double calcFactor_(const short mantissa, const short exponent,const short base = Derived::internals_.base_) 
     { 
      assert(mantissa > 0); 
      assert(mantissa < NumericLimits<short>::max); 
      assert(exponent < NumericLimits<short>::max); 
      assert(exponent > NumericLimits<short>::min); 
      assert(base < NumericLimits<short>::max); 
      assert(base > NumericLimits<short>::min); 
      return mantissa * ::pow(static_cast<long double>(base),exponent); 
     } 

et dans d'autres endroits dans mon programme, je suis également d'utiliser ces appels identiques à affirmer, donc je voudrais passer hors de ce corps fnc au fnc séparé et placer seulement l'appel à ce Fnc dans les endroits où j'ai maintenant ces appels aux capitaux. Mais corrigez-moi si je me trompe: Ces appels à affirmer seront supprimés dans la version ver, mais si je dois:

void Assert (//neccesary args here) 
{ 
assert(mantissa > 0); 
       assert(mantissa < NumericLimits<short>::max); 
       assert(exponent < NumericLimits<short>::max); 
       assert(exponent > NumericLimits<short>::min); 
       assert(base < NumericLimits<short>::max); 
       assert(base > NumericLimits<short>::min); 
} 

appelleront à ce fnc également être retiré de la libération ver ou non? Et un autre Q je pense qu'au lieu d'affirmer ici je devrais avoir des vérifications if (! Condition) car quel est l'avantage d'avoir des affirmations si elles seront supprimées dans un ver final. Qu'est-ce que tu penses?

+0

Les assertions sont supprimées lorsque NDEBUG est défini. Ce n'est jamais une bonne idée d'effectuer des déclarations avec des effets secondaires dans les déclarations assert, car ils peuvent être supprimés. –

+2

Il suffit de noter que ces affirmations sont assez inutiles, court ne peut pas contenir des valeurs plus grandes alors 'NumericLimits :: max' –

+0

@Let_Me_Be vous avez absolument raison, voir que juste savoir. –

Répondre

1

Oui, assert n'atteindra pas la version finale, mais les appels à votre fonction Assert resteront. Au mieux, votre compilateur pourrait détecter une fonction vide et supprimer l'appel, mais je ne compterais pas dessus. Si vous vraiment voulez supprimer ces appels de la version de construction, vous pouvez les entourer avec certains #ifdef/#endif.

En ce qui concerne les avantages d'affirmer, c'est clairement "subjectif et argumentatif" donc je vais passer!

1

Vous devriez toujours coupler la vérification d'erreurs avec les assertions. Sinon, vous ne gagnez rien en mode de libération puisque tout votre code de stabilité aura disparu. Donc, si j'étais vous, je mettrais des instructions pour éviter que des données incorrectes ou invalides ne pénètrent dans votre fonction. Pour savoir si votre fonction "vide" sera supprimée par le compilateur ou non dans les versions de version, je suppose que cela dépend du compilateur. Mais je ne laisserais pas les affirmations comme seul mécanisme pour déterminer si les données d'entrée sont valides ou non. Je collerais si des déclarations pour se prémunir contre cela. Par conséquent, cela devient un point discutable.

+0

Les assertions ne sont pas un "code de stabilité". Les assertions sont une forme de commentaires, sauf que le débogueur vérifie si ces commentaires sont corrects. Au-delà, comme les autres commentaires, les affirmations ne sont pas pertinentes pour le bon déroulement du programme. – MSalters

0

Je suppose que cela dépend si votre compilateur optimise un appel de fonction vide (puisque tous ces assert auront disparu).