_DEBUG vs NDEBUG

Quel préprocesseur définir devrait être utilisé pour spécifier des sections de code de débogage?

Utilisez #ifdef _DEBUG ou #ifndef NDEBUG ou existe-t-il une meilleure façon de le faire, par exemple #define MY_DEBUG ?

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

Visual Studio définit _DEBUG lorsque vous spécifiez l’ /MTd ou /MDd , NDEBUG désactive les assertions C standard. Utilisez-les le cas échéant, par exemple _DEBUG si vous souhaitez que votre code de débogage soit cohérent avec les techniques de débogage MS CRT et NDEBUG si vous souhaitez ê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 par des noms comportant un trait de soulignement, car ceux-ci sont réservés.

Je compte sur NDEBUG , car il est le seul dont le comportement est normalisé entre les compilateurs et les implémentations (voir la documentation de la macro assert standard). La logique négative est une petite vitesse de lecture, mais c’est un langage commun auquel vous pouvez rapidement vous adapter.

_DEBUG sur quelque chose comme _DEBUG reviendrait à s’appuyer sur un détail d’implémentation d’un compilateur et d’une implémentation de bibliothèque particuliers. D’autres compilateurs peuvent ou non choisir 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 offre une 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 à construire (et à tester), ce qui est sans doute peu bénéfique.

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

La norme NDEBUG est-elle?

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

La norme C ++ 2003 envoie le lecteur à la “page 326” dans “17.4.2.1 En-têtes” à la norme C.

Ce NDEBUG est similaire à Ceci est la même que la bibliothèque Standard C.

En C89 (les programmeurs C ont appelé cette norme en standard C) dans la section “4.2 DIAGNOSTICS”

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

Si NDEBUG est défini comme un nom de macro au point dans le fichier source où est inclus, la macro assert est définie simplement comme

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

Si vous regardez la signification des macros _DEBUG dans Visual Studio https://msdn.microsoft.com/en-us/library/b0084kay.aspx, vous verrez que cette macro est automatiquement définie par votre version de la langue du runtime de la langue .

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

À mon avis, cela est distinct 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 des macros activasortingces différentes, et j’utilise tout ce qui est approprié.

S’il n’y a pas de framework, j’utiliserais un nom sans trait de soulignement. ceux-ci ont tendance à être réservés à «l’implémentation» et j’essaye d’éviter les problèmes avec les collsions de noms – doublement quand le nom est une macro.

Soyez cohérent et peu importe lequel. Aussi, si pour une raison quelconque vous devez interagir avec un autre programme ou outil utilisant un identifiant DEBUG certain, il 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 enregistrer un fichier pdb pour les versions RELEASE. Ce qui signifie l’un des drapeaux -Zx et de l’éditeur de liens -DEBUG. Alors que _DEBUG concerne des versions de débogage spéciales de la bibliothèque d’exécution telles que les appels à malloc et free. Alors NDEBUG désactivera les assertions.