web-dev-qa-db-fra.com

À quoi sert la macro de préprocesseur NDEBUG (sur différentes plates-formes)?

Je suis intéressé par le but que diverses plates-formes/compilateurs ("implémentations")/frameworks attribuent aux [~ # ~] c [~ # ~] et la macro du préprocesseur C++ NDEBUG.

Le [~ # ~] c [~ # ~] ainsi que le standard C++ ne mentionnent cette définition qu'une seule fois, à savoir contrôler le comportement du assert() macro.

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 défaut .

L'une des raisons pour lesquelles cette question a été posée est que MS (Visual-C++) utilise toujours (?) "Leur" _DEBUG définir pour faire la distinction entre déboguer et publier des trucs et je me demandais si c'est une pratique courante pour une bibliothèque/plate-forme d'avoir leur "propre" débogage définir ou si d'autres bibliothèques/plates-formes utilisent NDEBUGpour leur déboguer des trucs liés.

36
Martin Ba

Cette décision appartient au (x) responsable (s) du cadre en question. Puisque de telles décisions sont sujettes à changement, ce n'est rien que vous devriez compter sur. J'utilise NDEBUG comme bascule pour tout ce qui concerne le débogage (par exemple, les sorties de trace), mais je pourrais changer d'avis dans la prochaine version. Aucune réponse que quiconque pourrait donner ici ne remplace la vérification de la documentation API des frameworks que vous utilisez dans un projet donné.

Cela étant dit, utiliser NDEBUG dans les en-têtes de bibliothèque/framework, pour toute autre chose maisassert(), serait une décision de conception plutôt stupide. Le programmeur d'application est explicitement autorisé à définir/annuler la définition de NDEBUG comme bon lui semble, avant et/ou après l'inclusion des en-têtes de n'importe quelle bibliothèque ou framework, de sorte que le responsable de lib/framework ne pouvait pas compter sur la définition de NDEBUG pour une version lib ou non définie pour une lib de débogage. Je doute que tout projet important se serait appuyé sur NDEBUG de cette façon.

22
DevSolar

La seule chose "standard" à propos de NDEBUG est qu'elle est utilisée pour contrôler si la macro assert va se développer en quelque chose qui effectue une vérification ou non. MSVC définit utilement cette macro dans les configurations de build de version 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 pourraient (ou non) faire quelque chose de similaire.

Notez que vous pouvez également modifier l'état de la macro NDEBUG dans une unité de traduction (fichier source) à l'aide de #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 imposé par la norme, et c'est le seul moment (je pense) où la norme permet d'inclure un en-tête standard une deuxième fois pour changer le comportement de compilation après la deuxième inclusion.

27
Michael Burr