Sé que esto es mucho después de la consulta original, pero aún puede ser útil.
Esto se puede hacer en GCC usando el operador de cadena "#", pero requiere dos etapas.
#define XSTR(x) STR(x)
#define STR(x) #x
El valor de una macro se puede mostrar con:
#pragma message "The value of ABC: " XSTR(ABC)
Consulte: 3.4 Cadena de caracteres en la documentación en línea de gcc.
Cómo funciona:
El preprocesador entiende las cadenas entre comillas y las maneja de manera diferente al texto normal. La concatenación de cadenas es un ejemplo de este tratamiento especial. El pragma del mensaje requiere un argumento que sea una cadena entre comillas. Cuando hay más de un componente en el argumento, todos deben ser cadenas para que se pueda aplicar la concatenación de cadenas. El preprocesador nunca puede asumir que una cadena sin comillas debe tratarse como si estuviera entre comillas. Si lo hizo, entonces:
#define ABC 123
int n = ABC;
no compilaría.
Ahora considere:
#define ABC abc
#pragma message "The value of ABC is: " ABC
que es equivalente a
#pragma message "The value of ABC is: " abc
Esto provoca una advertencia del preprocesador porque abc (sin comillas) no se puede concatenar con la cadena anterior.
Ahora considere el preprocesador stringize (que una vez se llamó stringificación, los enlaces en la documentación se han cambiado para reflejar la terminología revisada. (Ambos términos, por cierto, son igualmente detestables. El término correcto es, por supuesto, stringifaction. Esté listo para actualizar sus enlaces.)) operador. Esto actúa solo sobre los argumentos de una macro y reemplaza el argumento no expandido con el argumento entre comillas dobles. Así:
#define STR(x) #x
char *s1 = "abc";
char *s2 = STR(abc);
asignará valores idénticos a s1 y s2. Si ejecuta gcc -E, puede ver esto en la salida. Quizás STR se llamaría mejor algo como ENQUOTE.
Esto resuelve el problema de poner comillas alrededor de un elemento sin comillas, el problema ahora es que, si el argumento es una macro, la macro no se expandirá. Por eso se necesita la segunda macro. XSTR expande su argumento, luego llama a STR para poner el valor expandido entre comillas.