web-dev-qa-db-fra.com

L'utilisation de macros C / C ++ comme raccourci pour la compilation conditionnelle est-elle une bonne pratique?

Disons que je veux avoir plusieurs types de messages de sortie dans mon code. L'un d'eux est DEBUG, qui n'est imprimé que 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 à la fois en C et C++, car j'utilise les deux langages dans différents projets.

13
Eenoku

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ée même en dehors du mode de débogage. Le programmeur C typique choisira à tout moment une macro légèrement moche sur un effort d'exécution inutile.

19
Kilian Foth

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:

#ifdef _DEBUG
    void DebugMessage(...);
#else
    inline void DebugMessage(...) {}
#endif

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

13
Jack Aidley

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.

2
James O