una todas salida que procesador preprocesamiento preprocesador menciona lenguaje las informatica ifdef funciones funcion forma entrada encuentran ejemplos directivas directiva define declarar cual constante c gcc linux-kernel c-preprocessor

todas - menciona una forma de declarar una constante



Para macro de bucle que se desenrolló en la fase de pre-procesador? (4)

Quiero usar el preprocesador gcc para escribir casi la misma declaración de código 500 veces. digamos para fines de demostración, me gustaría usar una macro FOR_MACRO :

#define FOR_MACRO(x) / #for i in {1 ... x}: / const int arr_len_##x[i] = {i};

y al llamar a FOR_MACRO(100) se convertirá en:

const int arr_len_1[1] = {1}; const int arr_len_2[2] = {2}; ... const int arr_len_100[100] = {100};


En lugar de proporcionarle una solución para su problema exactamente, ¿está seguro de que no se puede manejar de una mejor manera?

Tal vez sería mejor

  • usa una matriz con una dimensión más
  • complete los datos con la ayuda de una matriz en tiempo de ejecución, ya que obviamente desea completar la primera entrada de cada matriz. Si deja la matriz sin inicializar, se colocará (siempre que se defina a nivel de módulo) en el segmento .bss en lugar de .data y probablemente necesite menos espacio en el archivo binario.

Esta no es una buena idea:

Si bien es posible en principio, usar el preprocesador significa que debe desenrollar manualmente el ciclo al menos una vez, termina con un límite arbitrario definido por la implementación en la profundidad del ciclo y todas las declaraciones se generarán en una sola línea.

Es mejor utilizar el lenguaje de scripting de su elección para generar el código (posiblemente en un archivo incluido independiente) e integrarlo con su proceso de compilación.


Puede usar, por ejemplo, P99 para realizar el desenrollado de dicho código del preprocesador. Pero debido a las capacidades limitadas del preprocesador, esto viene con un límite, y ese límite normalmente está muy por debajo de 500 .


Puede usar Order-PP para esto, si lo necesita desesperadamente.

Es un lenguaje de scripting implementado en el preprocesador. Esto significa que es conceptualmente similar al uso de un lenguaje de scripting para generar código C (de hecho, lo mismo), excepto que no hay herramientas externas y el script se ejecuta al mismo tiempo que el compilador de C: todo se hace con macros de C. A pesar de estar basado en el preprocesador, no existen límites reales para iteraciones de bucle, profundidad de recursión ni nada por el estilo (el límite está en algún lugar entre los miles de millones, no es necesario que se preocupe).

Para emitir el código solicitado en el ejemplo de la pregunta, puede escribir:

#include <order/interpreter.h> ORDER_PP( // runs Order code 8for_each_in_range(8fn(8I, 8print( 8cat(8(const int arr_len_), 8I) ([) 8I (] = {) 8I (};) )), 1, 101) )

No puedo entender por qué harías esto en lugar de simplemente integrar un lenguaje externo como Python en tu proceso de compilación (el pedido podría implementarse usando macros, pero aún así es un idioma separado para entender), pero la opción está ahí.

El orden solo funciona con GCC hasta donde yo sé; otros preprocesadores se quedan sin pila demasiado rápido (incluso Clang), o no son perfectamente compatibles con el estándar.