92 votes

Comment puis-je désactiver complètement les appels à assert() ?

Mon code est plein d'appels à assert(condition) . Dans la version de débogage, j'utilise g++ -g qui déclenche mes assertions. De manière inattendue, les mêmes assertions sont également déclenchées dans ma version de sortie, celle compilée sans -g option.

Comment puis-je désactiver complètement mes assertions au moment de la compilation ? Dois-je définir explicitement NDEBUG dans toutes les constructions que je produis, qu'elles soient de type debug, release ou autre ?

1 votes

Un peu hors sujet : si vous voulez des informations de débogage, -g est équivalent à -g2 . -g3 pourrait être un meilleur choix, car il rend disponible l'information la plus symbolique. Par exemple, à -g3 les #defines symboliques seront disponibles. J'ai vu certaines chaînes d'outils s'étouffer sur les -g3 cependant. En outre, de nombreuses bibliothèques externes dépendent également de -DDEBUG pour les constructions de type "débogage" (Posix n'atteste que de la présence de -DNDEBUG pour les versions "release").

114voto

GWW Points 20316

Vous devez #define NDEBUG (ou utiliser l'indicateur -DNDEBUG con g++ ) cela désactivera assert tant qu'il est défini avant l'inclusion du fichier d'en-tête assert.

2 votes

Doit se trouver avant #include <assert.h> ?

3 votes

@LeiYang Il semble qu'il faille ajouter l'avant-dernier. #include <assert.h> .

41voto

Prasoon Saurav Points 47488

Utilice #define NDEBUG

7.2 Diagnostic

1 L'en-tête défines le affirmer et fait référence à une autre macro,

NDEBUG

qui n'est pas défined par <assert.h> . Si NDEBUG est définie comme un nom de macro à l'endroit de la file source où elle est incluse, le nom de la macro n'est pas pris en compte. affirmer La macro est defined simplement comme

#define assert(ignore) ((void)0)

En affirmer La macro est redfined selon l'état actuel de l'économie. NDEBUG chaque fois que <assert.h> est inclus.

1 votes

Bonjour ! S'il est vrai que lorsque je définis -DNDEBUG, un appel à assert s'exécute quand même, c'est-à-dire ((void)0), est-ce que cela va dépenser un minimum de cycles CPU ? Je pensais que cela correspondait simplement à rien c'est à dire complètement AUCUN CODE..n'est-ce pas le cas ?

0 votes

@Abruzzo : C'est aussi ce que je pensais jusqu'à présent, mais en y réfléchissant, cela laisserait une place vide. ; à la place, ce qui peut être problématique si le assert est à l'intérieur d'un if par exemple. Je suis sûr que le compilateur optimise les lignes comme 0; loin

0 votes

@Abruzzo, et BTW, vérifiez si votre IDE ou votre système de construction vous permet de spécifier un modèle par défaut pour un nouveau projet. Vous pourrez alors définir NDEBUG dans la configuration de la version de chaque nouveau projet.

13voto

Alnitak Points 143355

En -g n'affecte pas le fonctionnement de assert il s'assure simplement que divers symboles de débogage sont disponibles.

Réglage de NDEBUG est la manière standard (officielle, norme ISO) de désactiver les assertions.

12voto

dcn Points 2014

Vous pouvez soit désactiver les assertions complètement en

#define NDEBUG
#include <assert.h>

ou vous pouvez définir NDEBUG (via -DNDEBUG) dans votre makefile/procédure de construction selon que vous voulez une version productive ou dev.

6voto

larsmans Points 167484

Oui, définissez NDEBUG sur la ligne de commande/système de construction avec l'option préprocesseur/compilateur -DNDEBUG .

Cela n'a rien à voir avec l'info de débogage insérée par -g .

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