Quelle définition de préprocesseur doit être utilisée pour spécifier les sections de débogage du code?
Utilisez #ifdef _DEBUG
ou #ifndef NDEBUG
ou existe-t-il une meilleure façon de le faire, par exemple #define MY_DEBUG
?
je pense _DEBUG
Visual Studio est spécifique, NDEBUG est-il standard?
Oui, c'est une macro standard avec la sémantique "Not Debug" pour les standards C89, C99, C ++ 98, C ++ 2003, C ++ 2011, C ++ 2014. Il n'y a pas
_DEBUG
macros dans les normes.La norme C ++ 2003 envoie le lecteur à "page 326" à "17.4.2.1 En-têtes" au standard C.
En C89 (les programmeurs C appelaient ce standard comme standard C) dans la section "4.2 DIAGNOSTICS", il était dit
Si vous regardez la signification des
_DEBUG
macros dans Visual Studio https://msdn.microsoft.com/en-us/library/b0084kay.aspx, vous verrez que cette macro est automatiquement définie par votre choix de version de la bibliothèque d'exécution du langage.la source
Je me fie
NDEBUG
, car c'est le seul dont le comportement est normalisé entre les compilateurs et les implémentations (voir la documentation pour la macro d'assertion standard). La logique négative est un petit accélérateur de lisibilité, mais c'est un idiome courant auquel vous pouvez vous adapter rapidement.S'appuyer sur quelque chose comme cela
_DEBUG
reviendrait à s'appuyer sur un détail d'implémentation d'un compilateur particulier et d'une implémentation de bibliothèque. D'autres compilateurs peuvent ou non choisir la même convention.La troisième option est de définir votre propre macro pour votre projet, ce qui est tout à fait raisonnable. Le fait d'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. Cependant, 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 tester) pour un avantage sans doute minime.
Avec l'une de ces options, si vous utilisez du code tiers dans le cadre de votre projet, vous devez savoir quelle convention il utilise.
la source
#if !defined(NDEBUG)
<- @HostileFork n'est-ce pas ce que vous vouliez dire?#if
non#ifdef
?#ifdef NDEBUG
... mais attirez une attention particulière à la logique négative avec#if !defined(NDEBUG)
. Sinon, il est un peu difficile d'attraper le n#ifndef NDEBUG
"La macro
NDEBUG
contrôle si lesassert()
instructions sont actives ou non.À mon avis, cela est distinct de tout autre débogage - j'utilise donc autre chose que
NDEBUG
de 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 des macros d'activation différentes, et j'utilise ce qui est approprié.S'il n'y a pas de cadre, j'utiliserais un nom sans trait de soulignement principal; ceux-ci ont tendance à être réservés à «l'implémentation» et j'essaie d'éviter les problèmes de collision de noms - doublement quand le nom est une macro.
la source
#if
code contrôlé dans l'autre.assert(huge_object.IsValid());
pourrait être lent alors que ceassert(ptr != nullptr);
n'est probablement pas le cas. Je suis d'accord avec Jonathan que la journalisation et le traçage devraient probablement être distincts des assertions, au moins dans les projets plus importants, mais je ne pense pas à la journalisation ou au traçage comme du code de débogage, c'est pourquoi j'ai demandé des éclaircissements.Soyez cohérent et peu importe lequel. De plus, 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
la source
Malheureusement, il
DEBUG
est fortement surchargé. Par exemple, il est recommandé de toujours générer et enregistrer un fichier pdb pour les builds RELEASE. Ce qui signifie l'un des-Zx
indicateurs et l'-DEBUG
option de l'éditeur de liens. While_DEBUG
concerne les versions de débogage spéciales de la bibliothèque d'exécution, telles que les appels àmalloc
etfree
. PuisNDEBUG
désactivera les assertions.la source