que preprocesamiento preprocesador informatica funcion ejecutar directivas directiva define compilar compilador objective-c c c-preprocessor

objective-c - preprocesamiento - gcc linux



Reemplazos para el preprocesador C (13)

Es posible que desee considerar m4.
http://www.gnu.org/software/m4/

Estoy interesado en usar algo más que el preprocesador C para preprocesar mi código fuente C y Objective-C. ¿Hay buenas alternativas?

Un ejemplo sería algo que le permita a uno escapar en un fragmento de Python o Perl en el medio del código C , y donde el fragmento escuche C que luego se compila como normal.


He pensado en este mismo problema en el pasado. Asegúrese de que está de acuerdo con el hecho de que cualquiera que quiera compilar su código necesitará la nueva herramienta de preprocesamiento también. Si usted es el único que trabajará en ello, no hay problema, pero si desea que el código esté disponible para otras personas, entonces quizás desee considerar si agregar o no un requisito de herramienta es una buena idea.


La respuesta corta es no." El preprocesador está tan íntimamente ligado a la semántica de C que realmente no se puede eliminar, y de hecho en algunos compiladores ni siquiera es una fase separada como solía ser en los viejos tiempos: compilar el Objetivo C en una Mac solo analiza la sintaxis de Objective C. Entonces, si bien podría usar otro macroprocesador, como m4, para procesar el texto fuente antes de pasarlo a C, no estaría eliminando el preprocesador C, estaría agregando otro paso de preprocesamiento.

Pero hay una pregunta más profunda aquí: ¿qué quieres ganar eliminando la fase de CPP?


Puede usar su lenguaje de programación favorito para crear un script / herramienta para generar archivos fuente (.c / .cpp o .h, o lo que sea). Simplemente #include o compilarlos en su proyecto. Puede ser útil tener comentarios cerca del #include para identificar qué / dónde está la herramienta y qué se genera.

Esto puede no ser tan útil (o limpio) como usar un preprocesador "real", pero funcionaría. Por otra parte, realmente depende de tu caso.



Cog no es exactamente un preprocesador, pero entra en línea en el código y genera cosas sobre la marcha.


CPP hace muchas cosas importantes para el código C que probablemente no necesite volver a implementar. Lo que parece estar buscando en su lugar puede ser un proceso de creación de plantillas que emita código C.

Cheetah es solo uno de los muchos que te permite usar Python. Hay otros que usan Python y aún más en otros idiomas, pero Cheetah es conocido por ser independiente de la producción, donde algunos motores de plantillas están muy orientados hacia HTML / XML. Haz tu investigación.


La idea de que ejecute código, cuyo resultado luego se empalma se denomina cuasiquotación . El código que ejecuta está anticuado .

Sé cómo resolver este problema usando Lua. He usado string.gsub con una función de antiquotación que escribí yo mismo . He usado sintaxis de shell para el antiquotation. Al igual que en el intérprete de comandos, el código anticuado devuelve una cadena que luego se empalma en el código.

Debajo de prog está el código C con el texto anticuado, y el antiquote es la función anti-cita. He usado la cuerda especial de Lua, citando corchetes dobles para aprovechar al máximo. En la práctica, no harías esto ; pondrías prog en un archivo separado.

names = { ''John'', ''Paul'', ''George'', ''Ringo'' } local prog = [===[ #include <stdio.h> main() { $(local out = { } for _, n in ipairs(names) do table.insert(out, string.format([[ printf("The name is %%s/n", %q);]], n)) end return table.concat(out, ''/n '') ) } ]===] local function antiquote(s) local body = s:match ''^%$%((.*)%)$'' return assert(loadstring(body))() end prog = prog:gsub(''%$%b()'', antiquote) io.stdout:write(prog)

En uso, el programa se ve así:

: nr@curlycoat 1181 ; lua /home/nr/tmp/emit-c.lua #include <stdio.h> main() { printf("The name is %s/n", "John"); printf("The name is %s/n", "Paul"); printf("The name is %s/n", "George"); printf("The name is %s/n", "Ringo"); }


Me interesaría ver qué se le ocurre a la gente. He tendido a hacer pequeñas cosas personalizadas con preprocesadores escritos en Perl. Es fácil armar un Makefile que llame al preprocesador. Por ejemplo, aquí hay una regla para llamar a un programa llamado ''meta'' para generar ''file.c'' desde ''file.c.meta''.

% :: %.meta meta $< > $@

Estoy haciendo cosas divertidas con ''meta'' como generar estructuras de datos C personalizadas. Definitivamente es una dirección que sugiero explorar. Mi esperanza es encontrar una meta biblioteca aproximadamente paralela a las plantillas de C ++.


Si abstrae un poco su problema, de hecho está buscando un motor de plantillas para su código. Así como la mayoría de los sitios web inserta contenido generado dinámicamente en plantillas estáticas, usted desea insertar código generado dinámicamente en su programa.

Actualmente uso Jinja2 (Python) para la mayoría del trabajo de creación de plantillas: he encontrado que es muy configurable en todos los sentidos.


Puede usar PHP como un preprocesador de C Las ventajas son:

  • muy similar sintaxis, por lo que el resaltado de sintaxis funciona.
  • <? y ?> no se usan en el estándar C (con C no estándar, lo único que se rompe es el antiguo operador de extensión GCC que devuelve min / max)
  • es rico en bibliotecas.
  • es turing completo.
  • el uso de macros es muy explícito. (en comparación con las macizas macros del preprocesador C)

Sin embargo, para un uso serio, hacer que PHP imprima las directivas #line es necesario para depurar el código preprocesado.

<?php include_once "stdio.h"; ?> int main() { <?php for($i = 0; $i < 20; $i++) echo ''printf("%d/n", ''.$i.'');''; ?> }


Si estás preparado para ensuciarte las manos con C ++, está el analizador de Wave en Boost, que está construido usando el analizador sintáctico de descenso recursivo Spirit. Es un preprocesador completo de C que cumple con todas las especificaciones más recientes para C y C ++ (y, por extensión, Objective C, AFAICS).

Es altamente modular para que pueda cambiar su propio controlador que podría hacer los extras que desee.

http://www.boost.org/libs/wave/doc/introduction.html


Claro, el preprocesador C estándar es muy limitado.
Recientemente he hecho una herramienta de este tipo: https://github.com/d-ash/perlpp

Por ejemplo esto

<? my @types = (''char'', ''int'', ''long''); foreach (@types) { ?> <?= $_ ?> read_<?= uc($_) ?>(<?= $_ ?>* v); <? } ?>

se convierte en esto

char read_CHAR(char* v); int read_INT(int* v); long read_LONG(long* v);

La sintaxis es similar a PHP, pero usa Perl en su lugar, y puede capturar textos en aguijones de Perl.

Editar por cxw : con la aprobación de @d-ash, también soy un desarrollador de perlpp. Si tiene alguna pregunta, no dude en escribirme un mensaje.