Comment mettre de la faire valoir dans les versions release en C/C++
J'ai besoin d'exécuter uniquement les navires de construire et j'ai besoin de faire valoir sur certaine condition dans la version build pour voir si le problème est résolu. Comment dois-je faire?
Quelle plate-forme? Windows et Visual Studio?
Il est généralement recommandé de ne pas garder des assertions dans les versions Release. Cependant, il peut y avoir une bonne raison de le faire; encore, il ne peut pas aussi être appelé "affirmation" et dans ce cas, il ne doit pas utiliser les mêmes appels de fonction.
Pourquoi ne pas utiliser une simple condition à la place? Pensez à ce que votre programme doit faire si l'assertion "" échoue. Vous ne devriez pas simplement appeler
Il est généralement recommandé de ne pas garder des assertions dans les versions Release. Cependant, il peut y avoir une bonne raison de le faire; encore, il ne peut pas aussi être appelé "affirmation" et dans ce cas, il ne doit pas utiliser les mêmes appels de fonction.
Pourquoi ne pas utiliser une simple condition à la place? Pensez à ce que votre programme doit faire si l'assertion "" échoue. Vous ne devriez pas simplement appeler
std::abort
dans un communiqué de construire. Si vous développez une application, lancer une exception. Si vous êtes l'élaboration d'une bibliothèque, de fournir une version de débogage.OriginalL'auteur | 2009-03-06
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas simplement de définir votre propre affirmer:
J'aime bien, mais souhaitez faire un bout de six ans de retard suggestion -- utiliser un nom différent pour votre affirmation que vous souhaitez existent dans les versions release et debug comme
ndbgassert
ou similaire. De cette façon, vous pouvez choisir entre les deux.Comment affirmer une MessageBox?? Ne devrait-elle pas de vérifier l'état de la première?
OriginalL'auteur Baiyan Huang
La destruction de la macro NDEBUG - vous pouvez le faire localement autour de la affirme que vous voulez rester dans le build:
ou faire ce que vous devez faire de votre processus de build ne permet pas de définir la macro NDEBUG en premier lieu.
Je l'ai juste essayé -- il ne fonctionne pas toujours. Si j'ai mis cette première deux lignes dans mon .rpc, il ne fait rien, il fonctionne, mais quand je l'ai mis juste au-dessus de ma main().
Alors, il semble que quelque chose doit être redéfinir NDEBUG et notamment
assert.h
de nouveau (peut-être quelques autres en-tête est inclus).OriginalL'auteur Michael Burr
Suffit d'appeler directement la partie de la
assert
définition de macro qui est actif en mode release.Vous trouverez de très définitions utiles pour les assertions en C++ dans ce grand article par Miro Samek (PDF). Ensuite, vous pouvez les modifier un peu pour répondre à vos besoins. Par exemple, vous pouvez créer une autre macro,
release_assert
, qui fait la même chose que d'affirmer mais peu importe si c'est en release ou debug mode.OriginalL'auteur Daniel Daranas
Le comportement par défaut de l'AFFIRMER, c'est pour annuler le programme en vertu de la configuration de Débogage, mais en général, cela devient un no-op sous un Communiqué de configuration. Je crois qu'il le fait par la vérification de l'existence du préprocesseur macro NDEBUG. Je ne suis pas au travail en ce moment donc impossible de vérifier ce point.
Je pense que la façon la plus simple de contourner ce problème consiste à modifier la configuration de Débogage pour activer toutes les optimisations au même niveau que la Libération (O2 à partir de la mémoire), et puis re-construire votre logiciel. Cela vous donnera l'équivalent de la performance et de la vitesse de Libération de la construction, mais il sera toujours définir le NDEBUG macro préprocesseur qui signifie que tous échoué Affirme sera toujours provoquer le programme pour l'abandonner. N'oubliez pas de modifier le niveau d'optimisation de revenir plus tard, sinon vous aurez des problèmes de débogage en vertu de la configuration de Débogage.
En général cependant, Affirme ne doit être utilisé pour la programmation des conditions préalables et jamais de gérer les défaillances dans le logiciel d'expédition. Vous souhaitez échouer rapidement au cours du développement, mais gracieusement en face de l'utilisateur.
OriginalL'auteur LeopardSkinPillBoxHat
J'aime à le définir de jeter une sorte de assert_exception dérivé d'un std::runtime_error. Puis l'attraper quelque part et faire quelque chose d'utile.
OriginalL'auteur Zan Lynx
En fait - et j'irais à la livraison de la version de débogage si vous pouvez vivre avec elle. Si vous n'avez pas besoin de la performance de la version, utilisez le débogage. Il ont tendance à avoir moins de bugs (ce qui est une simplification grossière et si vous programme est exempt de bugs, juste de commutation de la libération ne change rien à cela, mais à cause de choses que le compilateur ne en mode debug, les bugs peuvent ne pas se produire et/ou ont moins de graves conséquences).
Peut-être qu'il est aussi possible d'optimiser seulement le temps de parties critiques de votre programme.
Il peut aussi simplifier le débogage.
Même si cette réponse est downvoted, je crois qu'il frappe sur un point important, qui est la notion que la modification d'un tas de variables entre ce que les tests réalisés par le développeur principalement [la version debug], et ce qui est publié, n'est pas nécessairement une bonne idée. Développeurs expérimentés en atteste le fait Release et Debug versions présentent souvent des comportements différents.
OriginalL'auteur Tobias Langner
Lors de l'utilisation de Visual Studio, vous pouvez annuler la définition de la NDEBUG précompilateur définition de actif affirme dans le Communiqué de construire.
Par exemple, vous pouvez définir $(undefesTheNDEBUG) dans votre Projekt paramètres pour l'option /U, puis définir la variable d'environnement undefesTheNDEBUG à NDEBUG (SET undefesTheNDEBUG=NDEBUG) ou de le passer avec msbuild (/p:undefesTheNDEBUG=NDEBUG)
OriginalL'auteur Marco Kinski