ce que je voudrais faire (à des fins d'exploitation forestière) est quelque chose comme ceci:CPP: éviter l'expansion macro d'un paramètre de la fonction macro
Ce code a été écrit pour montrer mon problème, code réel est complexe et oui , j'ai de bonnes raisons d'utiliser des macros même sur C++ =)
# define LIB_SOME 1
# define LIB_OTHER 2
# define WHERE "at file #a, line #l, function #f: "
// (look for syntax hightlighting error at SO xd)
# define LOG_ERROR_SIMPLE(ptr, lib, str) ptr->log ("ERROR " str \
" at library " #lib);
# define LOG_ERROR(ptr, lib, str) LOG_ERROR_SIMPLE(ptr, lib, WHERE str)
LOG_ERROR_SIMPLE (this, LIB_SOME, "doing something")
LOG_ERROR (this, LIB_OTHER, "doing something else")
LOG_ERROR_SIMPLE()
écrit le mise en chaîne du paramètre lib (un nom macro entouré de " «)
mais LOG_ERROR
écrit la mise en chaîne de la macro déjà expander d ("2"). ceci est attendu, puisque lib a obtenu son expansion avant d'étendre et d'appeler LOG_ERROR_SIMPLE
. mais ce n'est pas ce dont j'ai besoin.
Fondamentalement, ma question est la suivante: comment éviter la macro-expansion d'un paramètre de fonction macro lors de l'appel d'une autre fonction macro?
Il y a une astuce que j'utilise qui évite l'expansion macro:
LOG_ERROR(ptr, lib, str, x) LOG_ERROR_SIMPLE(ptr, x##lib, WHERE str)
LOG_ERROR(this, LIB_OTHER, "some error",)
(coller x et lib produit LIB_OTHER
et cette valeur est utilisée pour appeler LOG_ERROR_SIMPLE
, son pas macro étendu avant cet appel)
Il existe un moyen d'obtenir ce même comportement sans utiliser un truc?
Lorsque vous utilisez le préprocesseur de GCC (en supprimant le '# include 'qui n'existe pas), j'obtiens le bon programme sur stdout, mais un message d'erreur sur stderr. t.c: 11: 1: erreur: coller "," et "BAR" ne donne pas un jeton de pré-traitement valide –
même ici, ne fonctionne pas avec gcc/g ++ –
Eh bien, "ne fonctionne pas" est un peu fort. J'ai eu un programme compilable sur stdout quand j'ai lancé 'gcc -E t.c'. –