define - macros in c++
¿Por qué se necesita un nivel de direccionamiento indirecto para esta macro de concatenación? (1)
Encontré una pequeña publicación de blog interesante que explica cómo generar nombres (semi) únicos en una macro usando el número de línea:
// Do magic! Creates a unique name using the line number
#define LINE_NAME( prefix ) JOIN( prefix, __LINE__ )
#define JOIN( symbol1, symbol2 ) _DO_JOIN( symbol1, symbol2 )
#define _DO_JOIN( symbol1, symbol2 ) symbol1##symbol2
Hay dos cosas aquí que realmente me confunden:
- ¿Por qué la macro
LINE_NAME
funciona incluso si se declaraJOIN
después de ella en el archivo? Pensé que el preprocesador de C hizo un paso lineal y, por lo tanto, necesitaría que las macros se definieran en función de la dependencia, al igual que las funciones de C deben definirse antes de que se usen. - ¿Por qué es necesario usar las macros
JOIN
y_DO_JOIN
para obtener el resultado correcto? Tener este nivel de direccionamiento indirecto en las macros parece muy extraño.
Tengo la sensación de que las respuestas a ambas preguntas están relacionadas, y tienen que ver con la forma en que el preprocesador de C evalúa las macros. (Sin embargo, mi intuición sobre cómo funcionan las macros parece estar muy lejos ya que ni siquiera pensé que el ejemplo fuera válido).
¿Por qué la macro LINE_NAME funciona incluso si se declara JOIN después de ella en el archivo?
Las macros no son funciones, cuando se les llama, el compilador las expande y el compilador en el punto de uso conoce todas las macros definidas.
¿Por qué es necesario usar las macros JOIN y _DO_JOIN para obtener el resultado correcto? Tener este nivel de direccionamiento indirecto en las macros parece muy extraño.
Debido a que __LINE__
sí es una macro, necesita dos niveles de expansión.
De lo contrario, la salida no es prefix1234
, será prefix__LINE__
.
Es útil leer esta respuesta también, y este hilo .