Je me suis mis à créer une macro de débogage C soignée, pas vraiment sûr de ce que je voulais vraiment (et étant désemparé quand il s'agit de macros) je me suis tourné vers google. Quelque temps plus tard, je pense maintenant que je sais ce que je veux, mais pas comment cela fonctionne. Je n'ai pas eu beaucoup de chance d'obtenir des informations décentes sur les macros et les techniques de débogage.Macro de débogage C (avec différentes "sources" de débogage)
Ce que je l'ai utilisé dans le passé ont été quelque chose comme ceci:
#ifdef DEBUG
#define DBG(x) printf x
#else
#define DBG(x) /* nothing */
#endif
Le problème est qu'il peut être assez désordonné et, finalement, vous finissez en commentant les anciens messages de débogage eventhough vous aurez probablement besoin d'eux plus tard.
Le meilleur exemple que j'ai trouvé de quelques diapositives à partir d'un cours avancé de c, qui se trouve ici: http://www.mpi-inf.mpg.de/departments/rg1/teaching/advancedc-ws08/script/lecture07.pdf (les parties pertinentes sont diapositive 19-23, mais la plupart sont inclus ci-dessous)
En tant que diapositives, ils ont malheureusement besoin d'explications. Mais ils mentionnent quelque chose qui semble très utile:
DBG((MOD_PARSER , "z = %d\n", z));
Où MOD_PARSER est un module debug/catégorie et le reste des arguments sont destinés à donner à printf.
Et la mise en œuvre de DBG:
#ifdef PRGDEBUG
#define DBG(x) dbg_printer x
#else
#define DBG(x) /* nothing */
#endif
void dbg_printer(int module , const char *fmt, ...);
Problème n ° 1 est d'écrire la fonction dbg_printer, je ne sais pas comment passer le nombre variable d'arguments à une instruction printf.
Les diapositives vont à discuter de la façon d'ajouter de nouveaux modules avec élégance et je suis assez certain que je ne l'ai pas compris du tout, mais quand même ...
*How to add new modules elegantly
*Add a file debug_modules.def
ADD_MOD(0, PARSER)
ADD_MOD(1, SOLVER)
ADD_MOD(2, PRINTER)
...
*“Generate” an enum with debug modules: debug.h
...
#define ADD_MOD(num, id) MOD_ ## id = 1 << num,
enum _debug_modules_t {
#include "debug_modules.def"
};
#undef ADD_MOD
...
...
*Preprocessor yields enum _debug_modules_t {
MOD_PARSER = 1 << 0,
MOD_SOLVER = 1 << 1,
MOD_PRINTER = 1 << 2,
};
Je ne vois pas pourquoi vous gauche changer les valeurs des éléments d'énumération, de chouettes truc que je Je suis manquant? Mis à part les diapositives ci-dessus, je n'ai pas vu un seul exemple ou article/post/quoi que ce soit mentionnant même ce peut-être que ce n'est même pas adapté à mes fins. Cela semble-t-il raisonnable et des techniques similaires sont-elles réellement utilisées?
A partir de maintenant la question est de savoir comment mettre en œuvre dbg_printer et vraiment comment l'énumération des modules de débogage est censé fonctionner, mais en voyant que la façon dont je pourrais avoir tout incompris qui pourrait changer :(
fprintf (dbg_fil e, fmt, ap); devrait être vfprintf ??? – Dipstick
Oups! Maintenant corrigé – caf