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.)
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.
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.
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.
@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");
}
Bindestrich
Sicher, der Standard-C-Präprozessor ist sehr begrenzt.
Ich habe kürzlich ein solches Tool erstellt: https://github.com/d-ash/perlpp
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
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
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.
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