À quoi sert la macro du préprocesseur NDEBUG (sur différentes plates-formes)?
Je suis intéressé par le but que diverses plates-formes / compilateurs ("implémentations") / frameworks attribuent à la macro C et C++ preprocessor NDEBUG
.
LeC ainsi que le standard C++ ne mentionnent cette définition qu'une seule fois, à savoir pour contrôler le comportement de la macro assert()
.
Je demanderais d'inclure uniquement des réponses spécifiques, où vous savez qu'une certaine plate-forme / framework / bibliothèque pour C ou C++ utilise la définition NDEBUG
pour activer ou désactiver toute autre chose en plus de la macro assert()
définie par la norme.
Une raison de poser cette question a été que MS (Visual-C++) toujours (?) utilise "leur" _DEBUG
définir pour distinguer entre les choses de débogage et de publication et je me demandais si c'était une pratique courante pour une bibliothèque / plate-forme d'avoir leur "propre" définition de débogage ou si d'autres bibliothèques / plates-formes utilisent NDEBUG
pour leurs choses liées au débogage.
2 réponses
C'est une décision du ou des responsables du framework en question. Étant donné que de telles décisions sont sujettes à changement, ce n'est rien sur lequel vous devriez compter. J'utilise NDEBUG comme bascule pour tout ce qui est lié au débogage (par exemple, les sorties de trace), mais je pourrais changer d'avis dans la prochaine version. Aucune réponse que personne ne pourrait donner ici est un remplacement pour vérifier la documentation de L'API des frameworks que vous utilisez dans un projet donné.
Cela étant dit, en utilisant NDEBUG dans les en-têtes de bibliothèque / framework, pour autre chose mais assert()
, serait une décision de conception plutôt stupide. Le programmeur d'application est explicitement autorisé à définir / désactiver NDEBUG comme bon lui semble, avant et / ou après avoir inclus les en-têtes de n'importe quelle bibliothèque ou framework, de sorte que le mainteneur lib / framework ne pouvait pas compter sur NDEBUG étant défini pour une lib release ou non défini pour une lib de débogage. Je doute qu'un projet important se soit appuyé sur NDEBUG de cette façon.
La seule chose' standard ' à propos de NDEBUG
est qu'elle est utilisée pour contrôler si la macro assert
se développera en quelque chose qui effectue une vérification ou non. MSVC définit utilement cette macro dans release build configurations en la définissant dans le projet pour vous. Vous pouvez modifier cela manuellement en modifiant la configuration du projet. D'autres chaînes d'outils peuvent (ou non) faire quelque chose de similaire.
Notez que vous pouvez également modifier l'état de la macro NDEBUG
dans une unité de traduction (source fichier) en utilisant #define
et / ou #undef
sur NDEBUG
et ré-inclure assert.h
pour modifier le comportement de la macro assert
(activez-la et désactivez-la). Ce comportement est mandaté par la norme, et est la seule fois (je pense) où la norme permet d'inclure un en-tête standard une deuxième fois pour changer le comportement de la compilation après la deuxième inclusion.