À 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 NDEBUGpour leurs choses liées au débogage.

36
demandé sur Brian Tompsett - 汤莱恩 2011-03-29 17:46:23

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.

22
répondu DevSolar 2011-03-30 07:27:50

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.

27
répondu Michael Burr 2011-03-29 14:37:04