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