web-dev-qa-db-fra.com

_DEBUG vs NDEBUG

Quelle définition de préprocesseur doit être utilisée pour spécifier les sections de code de débogage?

Utilisation #ifdef _DEBUG ou #ifndef NDEBUG ou existe-t-il un meilleur moyen de le faire, par exemple #define MY_DEBUG?

Je pense _DEBUG est spécifique à Visual Studio, est la norme NDEBUG?

126
deft_code

Visual Studio définit _DEBUG Lorsque vous spécifiez l'option /MTd Ou /MDd, NDEBUG désactive les assertions standard-C. Utilisez-les le cas échéant, c'est-à-dire _DEBUG Si vous voulez que votre code de débogage soit cohérent avec les techniques de débogage MS CRT et NDEBUG si vous voulez être cohérent avec assert().

Si vous définissez vos propres macros de débogage (et que vous ne piratez pas le compilateur ou le runtime C), évitez de commencer les noms avec un trait de soulignement, car ils sont réservés.

107
Christoph

Je me fie à NDEBUG, car c’est le seul dont le comportement est normalisé entre les compilateurs et les implémentations (voir la documentation de la macro d’assert standard). La logique négative est un petit speedbump de lisibilité, mais c'est un langage commun auquel vous pouvez vous adapter rapidement.

Pour compter sur quelque chose comme _DEBUG serait de s’appuyer sur les détails d’implémentation d’un compilateur et d’une librairie en particulier. D'autres compilateurs peuvent choisir ou non la même convention.

La troisième option consiste à définir votre propre macro pour votre projet, ce qui est tout à fait raisonnable. Avoir votre propre macro vous donne la portabilité entre les implémentations et vous permet d'activer ou de désactiver votre code de débogage indépendamment des assertions. Bien que, en général, je déconseille d’avoir différentes classes d’informations de débogage activées au moment de la compilation, car cela entraîne une augmentation du nombre de configurations que vous devez construire (et tester) pour un bénéfice sans doute minime.

Avec l'une de ces options, si vous utilisez du code tiers dans le cadre de votre projet, vous devez connaître la convention utilisée.

40
Adrian McCarthy

NDEBUG est-il standard?

Oui, il s’agit d’une macro standard avec la sémantique "Not Debug" pour les normes C89, C99, C++ 98, C++ 2003, C++ 2011, C++ 2014. Il n'y a pas _DEBUG macros dans les standards.

C++ 2003 standard envoie le lecteur à la "page 326" à "17.4.2.1 En-têtes" au standard C.

Ce NDEBUG est similaire à This Ceci est identique à la bibliothèque Standard C.

Dans C89 (les programmeurs C ont appelé cette norme la norme C) dans la section "4.2 DIAGNOSTICS", il a été dit

http://port70.net/~nsz/c/c89/c89-draft.html

Si NDEBUG est défini en tant que nom de macro au point du fichier source où est inclus, la macro assert est définie simplement comme

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

Si regarde le sens de _DEBUG _ macros dans Visual Studio https://msdn.Microsoft.com/en-us/library/b0084kay.aspx alors on verra que cette macro est automatiquement définie par votre choix de langage d’exécution. version de la bibliothèque.

38
bruziuz

La macro NDEBUG détermine si les instructions assert () sont actives ou non.

À mon avis, cela est distinct de tout autre débogage - j'utilise donc autre chose que NDEBUG pour contrôler les informations de débogage dans le programme. Ce que j'utilise varie en fonction du framework avec lequel je travaille. différents systèmes ont différentes macros d'activation et j'utilise ce qui convient.

S'il n'y a pas de cadre, j'utiliserais un nom sans trait de soulignement; ceux-ci ont tendance à être réservés à "l'implémentation" et j'essaie d'éviter les problèmes de collations de noms, encore plus lorsque le nom est une macro.

13
Jonathan Leffler

Soyez cohérent et peu importe lequel. Aussi, si pour une raison quelconque vous devez interopérer avec un autre programme ou outil en utilisant un certain identifiant DEBUG, c'est facile à faire

#ifdef THEIRDEBUG
#define MYDEBUG
#endif //and vice-versa
6
Earlz

Malheureusement, "DEBUG" est surchargé. Par exemple, il est recommandé de toujours générer et sauvegarder un fichier pdb pour les versions RELEASE. Ce qui signifie l'un des indicateurs -Zx et l'option de l'éditeur de liens -DEBUG. Bien que _DEBUG se rapporte à des versions spéciales de débogage de la bibliothèque d’exécution, telles que les appels à malloc et free. Ensuite, NDEBUG désactivera les assertions.

3
James