Al menos algunos preprocesadores de C le permiten secuenciar el valor de una macro, en lugar de su nombre, pasándolo de una macro similar a una función a otra que la secuencia:
#define STR1(x) #x
#define STR2(x) STR1(x)
#define THE_ANSWER 42
#define THE_ANSWER_STR STR2(THE_ANSWER) /* "42" */
Ejemplos de casos de uso aquí .
Esto funciona, al menos en GCC y Clang (ambos con -std=c99
), pero no estoy seguro de cómo funciona en términos estándar C.
¿Este comportamiento está garantizado por C99?
Si es así, ¿cómo lo garantiza C99?
Si no es así, ¿en qué punto pasa el comportamiento de definido por C a definido por GCC?
c
c-preprocessor
stringification
Peter Hosey
fuente
fuente
Respuestas:
Sí, está garantizado.
Funciona porque los argumentos de las macros son en sí mismos macro expandidos, excepto cuando el nombre del argumento de la macro aparece en el cuerpo de la macro con el stringifier # o el token-paster ##.
6.10.3.1/1:
Entonces, si lo hace
STR1(THE_ANSWER)
, obtendrá "THE_ANSWER", porque el argumento de STR1 no está macroexpandido. Sin embargo, el argumento de STR2 se expande macro cuando se sustituye en la definición de STR2, que por lo tanto le da a STR1 un argumento de42
, con el resultado de "42".fuente
Como señala Steve, esto está garantizado, y se ha garantizado desde el estándar C89, que era el estándar que codificaba los operadores # y ## en macros y obliga a expandir recursivamente macros en args antes de sustituirlos en el cuerpo si y solo si el cuerpo no aplica un # o ## al argumento. C99 no ha cambiado de C89 a este respecto.
fuente