Macro-producción de macros en C?

3 minutos de lectura

me gustaría conseguir el C preprocesador para generar macros para mí (es decir, solo estoy usando C99). yo escribiria una macro

#define make_macro(in) <...magic here...>

y cuando pongo

make_macro(name1)
make_macro(name2)

más adelante en el código, se expandiría a

#define name1(...) name1_fn(name1_info, __VA_ARGS__)
#define name2(...) name2_fn(name2_info, __VA_ARGS__)

y luego podría usar name1 y name2 como funciones (macro-implementadas). Creo que estoy atascado usando macros en ambos pasos: tiene sentido usar una macro para volver a llenar una plantilla repetidamente, y el manejo de argumentos variados no funcionará excepto a través de una macro.

Entonces, ¿qué entra en el marcador de posición <...magia aquí...> para hacer esto? En este punto, estoy empezando a creer que no es posible en C99, pero tal vez me estoy perdiendo algunos detalles de sintaxis.

  • ¿Por qué una macro? No entiendo este punto de “rellenar repetidamente una plantilla”. que plantilla y que recarga?

    – Johannes Schaub – litb

    13 mayo 2009 a las 20:45

No es posible en el estándar C.

¿Has considerado usar macros M4? Creo que están disponibles en la mayoría de las plataformas, así que eso no debería ser una limitación.

Página M4 GNU

  • +1, M4 a menudo se pasa por alto y es una herramienta de generación de código muy poderosa. Sin embargo, desearía que la gente dejara de hacer bromas sobre LISP cada vez que me ven usarlo.

    – Tim Publicar

    14 de mayo de 2009 a las 5:14

Macro produccion de macros en C
Chris Arguin

Como todos han dicho, no puedes hacer exactamente lo que estás pidiendo.

Es posible que pueda hacer algo así al obligar al preprocesador C a ejecutarse dos veces, por ejemplo, con una regla como esta en el archivo MAKE:

.c.pp:
   $(CPP) $< -o $@

Luego asigne a su archivo la extensión test.pp. Makefile lo ejecutará una vez para generar el archivo .c, y luego la ejecución normal en el archivo .c lo ejecutará una segunda vez.

Personalmente, preferiría escribir un script externo en Perl o algo así para generar el código C por mí; es un poco más limpio que jugar juegos con el preprocesador C. Depende de la cantidad de código de la que estemos hablando.

  • inteligente, pero tengo la sensación de que ejecutar CPP en la salida de CPP podría causar problemas con líneas como pragmas y números de línea.

    – Miguel

    5 de febrero de 2016 a las 4:43

No es posible porque la macro se hace solo una vez.

Esto no significa que no puedas usar otras macros en tu macro, pero no puedes hacer

#define TEST #define HALLO 33

int x = TEST;

¡y espera que x sea 33 después! Lo que obtendrías es un error de sintaxis porque intentaste

int x = #define HALLO 33;

O tal vez el compilador ya se queja de #define en #define.

según C99 Sección 6.10.3.2:

Cada # token de preprocesamiento en la lista de reemplazo para una macro similar a una función debe ir seguido de un parámetro como el siguiente token de preprocesamiento en la lista de reemplazo.

Por lo tanto, sin duda podría poner un #define en una macro si tiene un parámetro llamado define pero nunca hará lo que deseas. Esto a menudo me molesta porque tengo que trabajar en C y, como tal, no puedo usar plantillas de C++.

Macro produccion de macros en C
0x6adb015

Tratar #define make_macro(name,...) name##_fn(name##_info, __VA_ARGS__).

Usar así:

make_macro(name1)
make_macro(name2,1)

y esto generaría

name1_fn(name1_info)
name2_fn(name2_info,1)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad