Mi modelo mental de cómo funciona el preprocesador es aparentemente incompleto, y esto me está volviendo loco.Preprocessor token expansion
Quiero concatenar dos tokens, pero el segundo token debe expandirse primero.
#define ANSWER 42
#define FOO foo_ ## ANSWER
Aquí, FOO
se expande a foo_ANSWER
, pero quiero que sea foo_42
. Por lo tanto, definir una macro MERGE
con la esperanza de que esto de alguna manera expandir los argumentos antes de la concatenación:
#define MERGE(x, y) x ## y
#define BAR MERGE(bar_, ANSWER)
Pero BAR
todavía se expande a bar_ANSWER
en lugar de bar_42
. Así defino otra macro HELPER
:
#define HELPER(x, y) MERGE(x, y)
#define BAZ HELPER(baz_, ANSWER)
Y ahora BAZ
se expande con éxito a baz_42
. Por el momento, esto me parece mágico.
¿Alguien me puede explicar este comportamiento? ¿Cómo funcionan las reglas de expansión exactamente?
lo siento decir que también me hice una pregunta posible duplicado de esta misma edición. Me pregunto por qué este comportamiento no está documentado claramente. Me refiero al algoritmo que opera el preprocesador. –
@sandundhammika: Está bastante claramente documentado en la especificación - sección 6.10.3 - aunque hay una serie de esquinas de comportamiento no definidas. –