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?
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.
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.
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.
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.
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
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.