web-dev-qa-db-fra.com

comment désactiver complètement l'assertion

J'ai mon code plein d'appel à assert(condition). Dans la version de débogage, j'utilise g++ -g exploitant mon assertion. À ma grande surprise, je peux voir l'assertion fonctionner également dans ma version finale, celle compilée sans -g option.

Comment désactiver complètement lors de la compilation mon assertion? Dois-je définir explicitement NDEBUG dans n'importe quelle version que je produis malgré le débogage, la version ou quoi que ce soit d'autre?

69

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

88
GWW

Utilisez #define NDEBUG

7.2 Diagnostics

1 L'en-tête définit la macro assert et fait référence à une autre macro,

NDEBUG

qui n'est pas dé fi ni par <assert.h>. Si NDEBUG est défini comme un nom de macro au point du fichier source où est inclus, la macro assert est définie simplement comme

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

La macro assert est redéfinie selon l'état actuel de NDEBUG chaque fois que <assert.h> Est inclus.

34
Prasoon Saurav

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

#define NDEBUG
#include <assert.h>

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

10
dcn

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

La définition de NDEBUG est la manière standard (comme dans la norme officielle ISO) de désactiver les assertions.

10
Alnitak

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

Cela n'a rien à voir avec les informations de débogage insérées par -g.

4
Fred Foo