preprocesador net directiva define curso conclase 004c c++ g++ newline c-preprocessor

c++ - net - ifndef



¿Cómo hacer que el preprocesador G++ produzca una nueva línea en una macro? (8)

Esta pregunta ya tiene una respuesta aquí:

¿Hay una manera en gcc / g ++ 4. * para escribir una macro que se expande en varias líneas?

El siguiente código:

#define A X / Y

Se expande en

X Y

Necesito una macro en expansión

X Y


¡Lo tengo!

#define anlb /* */ A /* */ B anlb anlb

gcc -E -CC nl.c

/* */ A /* */ B /* */ A /* */ B


¿Por qué importa el espacio?

El programa imake utilizado en las versiones (¿más antiguas?) De X11 usó el preprocesador C para generar archivos make, pero el programa imake usó una técnica especial para indicar los finales de línea con símbolos @@ en los extremos de las líneas, y luego procesó la salida posteriormente. del preprocesador para reemplazar los símbolos @@ con líneas nuevas.

A partir de este diseño, llego a la conclusión de que no hay una manera confiable de obtener nuevas líneas de macros expandidas en C (o C ++). De hecho, para C, no hay necesidad ya que:

  • C no se preocupa por las líneas nuevas en comparación con el espacio en blanco después de ejecutar el preprocesador C, y
  • No puede generar directivas de preprocesador desde macros, etc.

De la docs :

En la presente implementación, toda la expansión sale en una sola línea.


Dejando a un lado el hecho de que no poder poner nuevas líneas en las macros crea un código ilegible, lo que dificulta la depuración de las salidas del preprocesador. Es cierto que a C y C ++ no les importan las nuevas líneas, pero el preprocesador de C sí.

Realmente me gustaría hacer una macro ConditionalDefine (x, y) que genere lo siguiente.

#ifdef x #define y #endif

Lo siguiente define hacer algo cercano:

#define hash # #define nl #define _def_p8(A,B) A ifdef _P8_K60_BOARD_ A define B A endif #define X_def_p8(A,B) _def_p8(A,B) #define def_p8(A) X_def_p8(nl hash,A)

expandiendo lo siguiente:

def_p8(PTPD_DBGA 0)

resultados en:

# ifdef _P8_K60_BOARD_ # define PTPD_DBGA 0 # endif

Pero sin poder poner nuevas líneas antes de los hashes, no funcionaría como se esperaba. También es molesto los aros por los que tienes que saltar para acercarte.


Es esto lo que quieres:

#define A "X /nY"


Estoy bastante seguro de que CPP, al estar diseñado para C, que no se preocupa por las nuevas líneas, y todo, no puede manejar este tipo de trabajo. Aún así, puede marcar las nuevas líneas deseadas con alguna secuencia de marcador especial y pasar el resultado a través de sed o awk para obtener lo que desea.


Haga que la macro genere un marcado especial, diga __CR__ , luego __CR__ el resultado de CPP en un script que traduzca la macro a una nueva línea, por ejemplo, sed ''s/__CR__//n/g'' .

Acabo de encontrar esto útil para generar un patrón de código para rellenar a mano. Es bastante más fácil cuando el código es legible.


Simplemente puede poner una secuencia de caracteres mágicos en la macro, por ejemplo

#define X(y,z) y nl z

ejecutar gcc -E infile | sed g/s/nl//n/ > whatever gcc -E infile | sed g/s/nl//n/ > whatever

(Tal vez no sea exactamente correcto, pero entiendes la idea, ¿verdad? Pásala a través de sed o tr o ejecuta Emacs en la salida).

Hago esto a veces para usar macros C para generar código fuente y no, no quiero aprender a hacerlo en Perl o M4 u otra herramienta.