Ersatz für den C-Präprozessor [closed]

Lesezeit: 6 Minuten

Kens Benutzeravatar
Ken

Ich bin daran interessiert, etwas anderes als das zu verwenden C Präprozessor zur Vorverarbeitung von my C und Objective-C-Quellcode. Gibt es gute Alternativen?

Ein Beispiel wäre etwas, das es einem erlaubt, in ein Python- oder Perl-Snippet in der Mitte zu entkommen C Code, und wo der Schnipsel ausspuckt C das wird dann ganz normal kompiliert.

  • Können Sie ein konkretes Beispiel geben, das zeigt, wie (und warum) Sie Quellcode zur Kompilierzeit generieren möchten? Das könnte uns helfen, Vorschläge zu machen, die auf Ihre spezifischen Bedürfnisse abzielen. (Zum Beispiel vermute ich, dass C++-Vorlagen für Ihren Fall nicht funktionieren, aber es wäre gut, dies zu bestätigen.)

    – Ruben

    28. Dezember 2008 um 20:59 Uhr

  • Keine schlechte Idee: Hier ist ein IBM-Artikel, in dem der Autor ein Perl-Skript verwendet, um eine Nachschlagetabelle zu generieren. ibm.com/developerworks/linux/library/l-metaprog1/index.html

    Benutzer295190

    26. August 2011 um 20:45 Uhr

Benutzeravatar von milleniumbug
Millenniumbug

Sie können verwenden PHP als C-Präprozessor. Die Vorteile sind:

  • sehr ähnliche Syntax, daher funktioniert die Syntaxhervorhebung.
  • <? und ?> werden in Standard-C nicht verwendet (bei Nicht-Standard-C geht nur der alte GCC-Erweiterungsoperator kaputt, der min/max zurückgibt)
  • es ist reich an Bibliotheken.
  • es wird komplett.
  • Die Verwendung von Makros ist sehr explizit. (im Vergleich zu hinterhältigen C-Präprozessor-Makros)

Für den ernsthaften Gebrauch ist es jedoch erforderlich, PHP dazu zu bringen, die #line-Direktiven auszudrucken, um vorverarbeiteten Code zu debuggen.

<?php include_once "stdio.h"; ?>

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

  • das ist faszinierend

    – Félix Adriyel Gagnon-Grenier

    6. Oktober 2016 um 22:50 Uhr

  • Da sich dies jetzt auf Twitter, Reddit usw. verbreitet, denken die Leute bitte daran – nur weil Sie kann oder könnte meint nicht dich sollte.

    – Esko

    7. Oktober 2016 um 9:55 Uhr

  • @Esko: Eigentlich denke ich, dass es eine großartige Idee ist, wenn Sie Code während der Kompilierung dynamisch generieren möchten – insbesondere wenn der C-Präprozessor für das, was Sie versuchen, nicht leistungsfähig genug ist.

    – diejh

    7. Oktober 2016 um 12:25 Uhr

  • Wow. Das ist Pessimum.

    – Warren P

    8. Oktober 2016 um 0:19 Uhr

  • Endlich habe ich die wahre Bedeutung des Akronyms gefunden: “P”HP “H”eader “P”reprocesser. Es ist ein perfektes Werkzeug zur Vorverarbeitung .h Dateien.

    – Stern brillant

    8. Oktober 2016 um 11:02 Uhr


Vielleicht möchten Sie m4 in Betracht ziehen.
http://www.gnu.org/software/m4/

  • Für mich fühlt sich m4 zu sehr wie ein Wissenschaftsprojekt und nicht genug wie eine Präprozessorsprache an. Als ich das letzte Mal nachgesehen habe, hatte es kein Schleifenkonstrukt, sondern Anweisungen, wie man eines mit Rekursion erstellt. Ich nahm das als klares Signal, dass die Autoren zu klug für mein eigenes Wohl waren.

    – Michael Köhne

    28. Dezember 2008 um 20:55 Uhr

  • Schleifenkonstrukte wie diese? [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 ') ) } ]===]local function antiquote(s) local body = s:match '^%$%((.*)%)$ ' return assert(loadstring(body))() end prog = prog:gsub('%$%b()', antiquote) io.stdout:write(prog)

Im Einsatz sieht das Programm so aus:

: [email protected] 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");
}

Benutzeravatar von d-ash
Bindestrich

Sicher, der Standard-C-Präprozessor ist sehr begrenzt.
Ich habe kürzlich ein solches Tool erstellt: https://github.com/d-ash/perlpp

Zum Beispiel diese

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

wird dies

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

Die Syntax ähnelt PHP, verwendet aber stattdessen Perl und kann Texte in Perl-Stings erfassen.

Bearbeiten von cxw — Mit Zustimmung von @d-ash bin ich auch Betreuer von perlpp. Wenn Sie Fragen haben, können Sie mir gerne eine Nachricht schreiben!

  • Sie sollten ein Beispiel hinzufügen, wie es funktioniert.

    – António Almeida

    22. Februar 2013 um 15:48 Uhr

  • Das funktioniert großartig für mich, und danke, dass du meine Pull-Anfrage angenommen hast!

    – cxw

    4. Dezember 2016 um 14:57 Uhr

Benutzeravatar von Morten Siebuhr
Morten Siebuhr

Wenn Sie Ihr Problem ein wenig abstrahieren, suchen Sie tatsächlich nach einer Templating-Engine für Ihren Code. So wie die meisten Websites dynamisch generierte Inhalte in statische Vorlagen einfügen, möchten Sie dynamisch generierten Code in Ihr Programm einfügen.

verwende ich derzeit Jinja2 (Python) für die meisten Templating-Arbeiten – ich habe festgestellt, dass es so ist sehr in jeder Hinsicht konfigurierbar.

  • Sie sollten ein Beispiel hinzufügen, wie es funktioniert.

    – António Almeida

    22. Februar 2013 um 15:48 Uhr

  • Das funktioniert großartig für mich, und danke, dass du meine Pull-Anfrage angenommen hast!

    – cxw

    4. Dezember 2016 um 14:57 Uhr

Benutzeravatar von Thomas Perl
Thomas Perl

Wenn Sie bereit sind, sich mit etwas C++ die Hände schmutzig zu machen, gibt es den Wave-Parser in Boost, der mit dem rekursiven Abstiegsparser von Spirit erstellt wurde. Es ist ein vollständiger C-Präprozessor, der den neuesten Spezifikationen für C und C++ (und als Erweiterung Objective C, AFAICS) entspricht.

Es ist hochgradig modular, sodass Sie Ihren eigenen Treiber einschalten können, der die gewünschten Extras ausführen kann.

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

1402720cookie-checkErsatz für den C-Präprozessor [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy