Reemplazos para el preprocesador C [closed]

6 minutos de lectura

Reemplazos para el preprocesador C closed
Conocido

Estoy interesado en usar algo que no sea el C preprocesador para preprocesar mi C y código fuente de Objective-C. ¿Existen buenas alternativas?

Un ejemplo sería algo que permitiera escapar a un fragmento de python o perl en medio de C código, y donde el fragmento escupió C que luego se compila de forma normal.

  • ¿Podría proporcionar un ejemplo concreto que muestre cómo (y por qué) le gustaría generar código fuente en tiempo de compilación? Eso podría ayudarnos a presentar sugerencias que se ajusten a sus necesidades específicas. (Por ejemplo, supongo que las plantillas de C++ no funcionarán para su caso, pero sería bueno confirmarlo).

    – Rubén

    28 de diciembre de 2008 a las 20:59

  • No es una mala idea: aquí hay un artículo de IBM donde el autor usa un script de perl para generar una tabla de búsqueda. ibm.com/developerworks/linux/library/l-metaprog1/index.html

    usuario295190

    26 de agosto de 2011 a las 20:45

1647558727 218 Reemplazos para el preprocesador C closed
insecto del milenio

Puedes usar PHP como un preprocesador C. Las ventajas son:

  • sintaxis muy similar, por lo que el resaltado de sintaxis funciona.
  • <? y ?> no se usan en C estándar (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.
  • esta completo.
  • el uso de macros es muy explícito. (en comparación con las macros furtivas del preprocesador C)

Sin embargo, para un uso serio, se necesita hacer que PHP imprima las directivas #line 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.');';
    ?>
}

  • eso es fascinante

    – Félix Adriyel Gagnon-Grenier

    06/10/2016 a las 22:50

  • Como esto ahora se está difundiendo en Twitter, Reddit, etc., recuerden, solo porque lata o pudo no se refiere a ti deberían.

    – Esko

    7 oct 2016 a las 9:55

  • @Esko: En realidad, creo que es una idea increíble si desea generar código dinámicamente durante la compilación, en particular si el preprocesador C no es lo suficientemente potente para lo que está tratando de hacer.

    – el jh

    7 oct 2016 a las 12:25

  • Guau. Esto es pesimista.

    – Warren P.

    8 de octubre de 2016 a las 0:19

  • Finalmente encontré el verdadero significado de las siglas: “P”HP “H”eader “P”reprocesador. Es una herramienta perfecta para preprocesar .h archivos

    – Estrella brillante

    8 oct 2016 a las 11:02


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

  • Para mí, m4 se siente demasiado como un proyecto científico y no lo suficiente como un lenguaje de preprocesador. La última vez que miré, no tenía una construcción de bucle, sino que tenía instrucciones sobre cómo hacer una usando la recursividad. Tomé eso como una señal clara de que los autores eran demasiado inteligentes para mi propio bien.

    – Michael Kohne

    28 de diciembre de 2008 a las 20:55

  • ¿Construcciones en bucle, como estas? [gnu.org/software/m4/manual/html_node/…

    – Hasturkun

    Dec 29, 2008 at 8:20

  • m4 really is extremely versatile, but that syntax is just so brutal.! I really wish we had a more modern unix macro processor, but one compiled from C, like the venerable m4.

    – J. M. Becker

    Jun 6, 2013 at 18:06


  • I wrote a blog post about using m4 with C which might help a few get started: kvanberendonck.id.au/using-m4-with-c

    – kvanbere

    Apr 27, 2014 at 1:28

  • @TechZilla, Michael, David, Hasturkun, Folks, am I missing something? What’s wrong with using a real scripting language like PHP/JavaScript/Perl as a preprocessor?

    – Pacerier

    May 16, 2015 at 0:37


Cog isn’t exactly a pre-processor, but it does go in-line in the code and generates stuff on the fly.

  • can you expand your answer (I belive it’s best answer) by giving some example (otherwise I will make mine)

    – Xavier Combelle

    Oct 7, 2016 at 14:39

The idea that you run code, the result of which is then spliced in is called quasiquotation. The code you run is antiquoted.

I know how to solve this problem using Lua. I’ve used string.gsub with an antiquotation function I wrote myself. I’ve used shell syntax for the antiquotation. As in the shell the antiquoted code returns a string which is then spliced into the code.

Below prog is the C code with antiquoted text, and antiquote is the antiquotation function. I’ve used Lua’s special string quoting double square brackets to full advantage. In practice you wouldn’t do this; you’d put prog in a separate file.

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 ') ) } ]===]función local antiquote(s) cuerpo local = 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");
}

1647558728 132 Reemplazos para el preprocesador C closed
pizca

Claro, el preprocesador C estándar es muy limitado.
He hecho una herramienta de este tipo recientemente: 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 picaduras de Perl.

Editar por cxw — Con la aprobación de @d-ash, también mantengo perlpp. Si tiene preguntas, ¡no dude en escribirme!

  • Deberías añadir un ejemplo de cómo funciona.

    – Antonio Almeida

    22 de febrero de 2013 a las 15:48

  • ¡Esto funciona muy bien para mí, y gracias por aceptar mi solicitud de extracción!

    – cxw

    4 de diciembre de 2016 a las 14:57

Reemplazos para el preprocesador C closed
Morten Siebuhr

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

actualmente uso Jinja2 (Python) para la mayoría de los trabajos de plantillas; descubrí que es muy configurable en todos los sentidos.

  • Deberías añadir un ejemplo de cómo funciona.

    – Antonio Almeida

    22 de febrero de 2013 a las 15:48

  • ¡Esto funciona muy bien para mí, y gracias por aceptar mi solicitud de extracción!

    – cxw

    4 de diciembre de 2016 a las 14:57

1647558728 464 Reemplazos para el preprocesador C closed
Tomas Perl

Si está preparado para ensuciarse las manos con algo de C ++, está el analizador Wave en Boost, que se construye utilizando el analizador 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, por lo que puede cambiar su propio controlador que podría hacer los extras que desee.

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

¿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