Disons que je veux avoir plusieurs types de messages de sortie dans mon code. L'un d'eux est DEBUG
, qui est imprimé uniquement, lorsque le code est compilé en mode débogage.
Habituellement, je devrais écrire quelque chose comme
#ifdef DEBUG
std::cout << "Debug message" << std::endl;
#endif
ce qui est assez lourd et ennuyeux à utiliser dans de nombreux endroits.
Est-ce une bonne pratique de définir une macro pour l'extrait de code, donc vous l'utiliseriez de cette façon?
MSG_DEBUG("Debug message")
Ou existe-t-il une autre manière plus élégante de gérer cela sans macros? Je m'intéresse aux solutions possibles en C et C ++, car j'utilise les deux langages dans différents projets.
constexpr if
en C ++, par exemple.STDERR
. Aussi, pourquoi ne pas le faire dépendreNDEBUG
commeassert()
ça à la place? Ensuite, vous pouvez le définir comme#define DEBUG_MSG(MSG) assert(std::cerr << MSG)
, qui teste également l'état du flux.Réponses:
Bien sûr, si vous êtes d'accord avec l'utilisation de macros en premier lieu, alors en définir une paramétrisée plutôt que de continuer à répéter le même code conditionnel est certainement préférable par toute mesure de bon codage.
Devez-vous utiliser des macros? À mon avis, vous devriez, car c'est une pratique acceptée en C, et toute solution sans macro nécessiterait au moins quelque chose d' être exécuté même en dehors du mode débogage. Le programmeur C typique choisira à tout moment une macro légèrement moche sur un effort d'exécution inutile.
la source
Il y a un élément de préférence personnelle ici, mais en C ++, je préfère le faire dans le fichier d'en-tête:
Pour que la fonction soit en ligne dans les versions, mais est une fonction appropriée dans la version de débogage afin que vous puissiez avoir une vérification de type appropriée, des messages d'erreur sensibles, etc. et la possibilité d'ajouter plus de fonctionnalités (journalisation peut-être?) Plus tard.
De toute évidence, vous devez également insérer la définition correspondante de la fonction dans le
.cpp
fichier dans un#ifdef _DEBUG
bloc.la source
Certainement, assurez-vous simplement que vous ne respectez pas les directives de code données par votre équipe. Assurez-vous qu'aucun autre code du système n'essaye d'atteindre la même fonctionnalité via une condition if générale.
la source