DEBUG vs NDEBUG

quel préprocesseur définir doit être utilisé pour spécifier les sections de débogage du code?

utilisez #ifdef _DEBUG ou #ifndef NDEBUG ou y a-t-il une meilleure façon de le faire, p.ex. #define MY_DEBUG ?

je pense que _DEBUG est spécifique à Visual Studio, est NDEBUG standard?

113
demandé sur Martin Ba 2010-02-18 19:59:37

6 réponses

Visual Studio définit _DEBUG quand 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 compatible avec les techniques de débogage MS CRT et NDEBUG si vous voulez être compatible avec assert() .

si vous définissez vos propres macros de débogage (et que vous ne hackez pas le compilateur ou l'exécution C)), évitez de commencer les noms avec un underscore, car ceux-ci sont réservés.

102
répondu Christoph 2017-10-02 03:46:38

je me fie à NDEBUG , parce que c'est le seul dont le comportement est normalisé à travers les compilateurs et les implémentations (voir la documentation pour la macro assert standard). La logique négative est une petite speedbump lisible, mais c'est un langage courant auquel vous pouvez rapidement vous adapter.

s'appuyer sur quelque chose comme _DEBUG serait de s'appuyer sur un détail d'implémentation d'un compilateur particulier et d'implémentation d'une bibliothèque. Les autres compilateurs peuvent ou non choisir même convention.

La troisième option est de définir votre propre macro pour votre projet, ce qui est tout à fait raisonnable. Avoir sa propre macro vous donne la portabilité à travers 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 qui sont activées au moment de la compilation, car cela provoque une augmentation du nombre de configurations que vous devez construire (et test) pour un bénéfice sans doute minime.

Avec l'une de ces options, si vous utilisez un code tiers dans le cadre de votre projet, vous devez être conscient de la convention qu'il utilise.

36
répondu Adrian McCarthy 2015-03-11 15:58:18

est NDEBUG standard?

Oui, c'est une macro standard avec la sémantique "Pas Debug" pour C89, C99, C++98, C++2003, C++2011, C++2014 normes. Il n'y a pas de macros _DEBUG dans les standards.

C++2003 standard envoyer le lecteur à la page "326" à "17.4.2.1 en-Têtes" à la norme C.

Que NDEBUG est la même C'est la même que la bibliothèque Standard C.

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

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

si NDEBUG est défini comme un nom macro au point du fichier source où est inclus, la macro assert est défini simplement comme

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

si on regarde le sens de _DEBUG macros en studio visuel https://msdn.microsoft.com/en-us/library/b0084kay.aspx ensuite, vous verrez que cette macro est automatiquement définie par votre choix de langue de la version de la bibliothèque runtime.

32
répondu bruziuz 2015-08-05 23:31:38

La macro NDEBUG contrôle si la fonction assert() les instructions sont actives ou non.

à mon avis, c'est séparé de tout autre débogage - donc J'utilise autre chose que NDEBUG pour contrôler les informations de débogage dans le programme. Ce que j'utilise varie, selon le cadre avec lequel je travaille; différents systèmes ont différentes macros habilitantes, et j'utilise tout ce qui est approprié.

S'il n'y a pas de framework, j'utiliserais un nom sans underscore; ceux - ci ont tendance à être réservés à "la mise en œuvre" et j'essaie d'éviter les problèmes avec les collsions de noms-doublement ainsi quand le nom est une macro.

13
répondu Jonathan Leffler 2010-02-18 19:35:49

soit cohérent et peu importe lequel. Aussi si pour une raison quelconque vous devez interoper avec un autre programme ou outil en utilisant un certain Identificateur de débogage c'est facile à faire

#ifdef THEIRDEBUG
#define MYDEBUG
#endif //and vice-versa
6
répondu Earlz 2010-02-18 17:04:16

malheureusement "DEBUG"est surchargé. Par exemple, il est recommandé de toujours générer et sauvegarder un fichier pdb pour les constructions de RELEASE. Ce qui signifie un des drapeaux-Zx, et l'option-DEBUG linker. Tandis que _DEBUG se réfère à des versions de débogage spéciales de la bibliothèque runtime telles que les appels à malloc et free. Alors NDEBUG va désactiver les assertions.

3
répondu James 2013-09-15 13:24:49