2010-06-17 9 views
5

Ich würde im Idealfall in der Lage sein, (sehr repetitive) C/C++ - Code zu meinem tatsächlichen Code hinzuzufügen, aber zur Kompilierzeit, Code, der von sagen würde, die Stdout eines Python Skript, genauso wie man es mit Makros macht.Generieren von Code zur Kompilierzeit mit Skripten

Zum Beispiel lassen Sie uns sagen, dass ich Funktionen haben möchten, die auf den öffentlichen Attribute einer Klasse ab, in der Lage, nur die folgenden in meinem C++ zu schreiben Code wäre ein Segen sein:

generate_boring_functions(FooBarClass,"FooBarClass.cpp") 

Ist das machbar mit konventionellen Mitteln? Oder muss ich mit Makefiles und temporären Quelldateien hacken?

Danke.

+0

Ich dachte Makefiles waren herkömmliche Mittel. Was hattest du im Sinn? –

+1

Was sind die langweiligen Funktionen? Sind sie etwas, das mit einer vorlagenbasierten Lösung gelöst werden könnte? –

+0

Nein, es ist nicht Template-lösbar, und ich weiß Makefiles sind konventionelle Mittel, aber ich meinte nur etwas, das nur funktionieren würde, indem ich das dumme einfache "g ++ foo.cpp -o foo" mache, ich denke, das ist zu viel verlangt;) – Manux

Antwort

3

Sie tun wahrscheinlich benötigen, das Makefile ein wenig zwicken. Es wäre einfach, ein (Python) -Skript zu schreiben, das jede Ihrer Quelldateien als zusätzlichen Vorverarbeitungsschritt liest und Instanzen von generate_boring_functions (oder eines anderen Skriptmakros) durch den korrekten Code ersetzt, möglicherweise indem einfach generate_boring_functions.py mit den richtigen Argumenten aufgerufen wird und die Notwendigkeit für temporäre Dateien umgehen, indem die Quelle über Standardeingabe an den Compiler gesendet wird.

Verdammt, jetzt will ich, so etwas machen.

Bearbeiten: Eine Regel wie diese, in einem Makefile stecken, könnte verwendet werden, um den zusätzlichen Build-Schritt zu behandeln. Dies ist nicht getestet und nur für einige Schuss auf Vollständigkeit hinzugefügt.

+0

Wie würde ich die Quelle an den Compiler über stdin (nicht mit temporären Dateien) senden? – Manux

+0

Oy, http://stackoverflow.com/questions/2083874/compile-string-of-c-code – Manux

+0

@Manux: Dieser Ansatz würde nur mit einer Quelldatei gleichzeitig arbeiten ... –

2

A Make-Datei (oder ein Äquivalent) ist eine "konventionelle" bedeutet!

0

Sie konnten die Boost-Preprocessor Bibliothek versuchen. Es ist nur eine Erweiterung des regulären Präprozessors, aber wenn Sie kreativ sind, können Sie fast alles darin erreichen.

3

Wenn ein Makefile nicht konventionell genug für Sie ist, könnten Sie mit ausgeklügelten Makros auskommen.

class FooBarClass 
{ 
    DEFINE_BORING_METHODS(FooBarClass) 

    /* interesting functions begin here */ 
} 

Ich sehe dies getan sehr häufig die Textteile von COM-Klassen zu implementieren.

Aber wenn Sie etwas wollen, das weder make noch Makro ist, dann weiß ich nicht, was Sie möglicherweise meinen könnten.

+0

+1 Makros zur Vereinfachung des Standardcodes. –

0

Haben Sie einen Blick auf PythoidC? Es kann verwendet werden, um C-Code zu generieren.

2

Ich habe nie diese spezielle Technologie verwendet, aber es klingt, als ob Sie nach etwas wie Ned Batchelder's Cog Werkzeug suchen.

Python-Skripte sind in eine C++ - Quelldatei eingebettet, sodass beim Ausführen des Cog-Tools zusätzlicher C++ - Code generiert wird, den der C++ - Compiler verwenden kann. Ihr Build-Prozess würde also aus einem zusätzlichen Schritt bestehen, damit cog die eigentliche C++ - Quelldatei erzeugt, bevor der C++ - Compiler aufgerufen wird.

Verwandte Themen