Quello che mi piacerebbe fare (a fini di registrazione) è qualcosa di simile:CPP: evitare l'espansione delle macro di un parametro di funzione macro
Questo codice è stato scritto per mostrare il mio problema, codice vero e proprio è complessa e sì , ho buone ragioni per utilizzare le macro anche su 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()
scrive il in stringa del parametro lib (un nome di macro circondato da " ")
ma poi LOG_ERROR
scrive il in stringa della macro già expande d ("2"). questo è previsto, dal momento che lib ha ottenuto la sua espansione prima di espandersi e chiamare LOG_ERROR_SIMPLE
. ma questo non è ciò di cui ho bisogno.
Fondamentalmente la mia domanda è questa: come evitare macro l'espansione di un parametro funzione macro quando si chiama un'altra funzione macro?
C'è un trucco che uso che evita macro espansione:
LOG_ERROR(ptr, lib, str, x) LOG_ERROR_SIMPLE(ptr, x##lib, WHERE str)
LOG_ERROR(this, LIB_OTHER, "some error",)
(incollare x e lib produce LIB_OTHER
e questo valore viene utilizzato per chiamare LOG_ERROR_SIMPLE
, la sua non macro espansa prima chiamata)
C'è un modo per ottenere questo stesso comportamento senza usare un trucco?
Quando si utilizza il preprocessore di GCC (rimuovendo '# include' che non esiste), ottengo il programma corretto su stdout, ma un messaggio di errore su stderr. t.c: 11: 1: errore: incollare "," e "BAR" non fornisce un token di preelaborazione valido –
qui, non funziona con gcc/g ++ –
Bene, "non funziona" è un po 'forte. Ho ottenuto un programma compilabile su stdout quando ho eseguito 'gcc -E t.c'. –