So che è passato molto tempo dalla query originale, ma potrebbe comunque essere utile.
Questo può essere fatto in GCC utilizzando l'operatore stringify "#", ma richiede due fasi.
#define XSTR(x) STR(x)
#define STR(x) #x
Il valore di una macro può quindi essere visualizzato con:
#pragma message "The value of ABC: " XSTR(ABC)
Vedere: 3.4 Stringificazione nella documentazione in linea di gcc.
Come funziona:
Il preprocessore comprende le stringhe quotate e le gestisce in modo diverso dal testo normale. La concatenazione di stringhe è un esempio di questo trattamento speciale. Il pragma del messaggio richiede un argomento che sia una stringa tra virgolette. Quando è presente più di un componente per l'argomento, devono essere tutti stringhe in modo che possa essere applicata la concatenazione di stringhe. Il preprocessore non può mai presumere che una stringa non quotata debba essere trattata come se fosse quotata. In tal caso:
#define ABC 123
int n = ABC;
non si compilerebbe.
Ora considera:
#define ABC abc
#pragma message "The value of ABC is: " ABC
che è equivalente a
#pragma message "The value of ABC is: " abc
Ciò causa un avviso del preprocessore perché abc (non quotato) non può essere concatenato con la stringa precedente.
Ora considera il preprocessore stringize (che una volta era chiamato stringificazione, i collegamenti nella documentazione sono stati modificati per riflettere la terminologia rivista. (Entrambi i termini, per inciso, sono ugualmente detestabili. Il termine corretto è, ovviamente, stringifaction. Preparati ad aggiornare i tuoi collegamenti.)) operatore. Agisce solo sugli argomenti di una macro e sostituisce l'argomento non espanso con l'argomento racchiuso tra virgolette doppie. Così:
#define STR(x) #x
char *s1 = "abc";
char *s2 = STR(abc);
assegnerà valori identici a s1 e s2. Se esegui gcc -E puoi vederlo nell'output. Forse STR sarebbe meglio chiamare qualcosa come ENQUOTE.
Questo risolve il problema di inserire virgolette attorno a un elemento non quotato, il problema ora è che, se l'argomento è una macro, la macro non verrà espansa. Questo è il motivo per cui è necessaria la seconda macro. XSTR espande il suo argomento, quindi chiama STR per inserire il valore espanso tra virgolette.