Code zur Compilezeit
-
Hallo,
für mein Programm müssen mehrere POD-Instanzen (mit demselben Typ) genutzt werden. Zum Beispiel "Bauklotz", der eine Farbe und eine Form enthält.
Diese sollen zur Compilierung festgelegt und somit nicht vom späteren Nutzer geändert werden können.
Eine Möglichkeit wäre:struct Bauklotz { unsigned char color_red; unsigned char color_green; unsigned char color_blue; enum {DICE, BALL, PYRAMID} shape; }; const Bauklotz kloetze[] = { {10, 20, 30, Bauklotz::BALL}, {255, 0, 0, Bauklotz::BALL}, {0, 155, 155, Bauklotz::PYRAMID} };Das ist aber unübersichtlich und nervig zu tippen.
Daher habe ich an die Alternative gedacht, txt-Dateien in einem Ordner zu verwalten, die diese Informationen enthalten.
// 1.txt 10 20 30 BALL // 2.txt RED BALL // 3.txt 0 155 155 PYRAMIDDas Problem ist aber, dass, wenn ich die Daten aus diesen Dateien lese, sie einfach vom Nutzer geändert werden können.
Von daher: Gibt es eine Möglichkeit, dass bestimmter Code schon zur Compilezeit ausgeführt wird? Damit könnte ich die Daten dann in eine konstante Variable laden. Oder gibt es andere Wege, mein Vorhaben gut umzusetzen?
-
Egal wie du es anstellst, um das Tippen wirst du nicht herumkommen - und die Variante mit den Hilfsdateien dürfte um einiges aufwendiger sein als das Array von Hand anzulegen.
-
baukloetzchen_incl.hpp:
const Bauklotz[] kloetze = { #include "kloetzchen.txt" };kloetzchen.txt:
{ 10, 20, 30, Bauklotz::BALL }, {255, 0, 0, Bauklotz::BALL}, {0, 155, 155, Bauklotz::PYRAMID}Verwendung:
#include "baukloetzchen_incl.hpp" void kill_everything() { kloetze[42].explode(); play_sound("boom.wav"); }
-
Du könntest in deinem Makefile die Definitionen aus den Textdateien durch ein Script, z.B. in Perl, generieren lassen.
-
@ CStoll: Wieso dürfte die aufwändiger sein? Entweder es gibt die Möglichkeit, die Dateien zur Compilezeit zu lesen oder es gibt sie nicht.?
@ 314159265358979: Das macht die Sache aber nicht viel übersichtlicher. Kann man eine Datei per include nicht als String speichern?
Außerdem sollten automatisch alle Dateien in einem Ordner geladen werden und nicht eine Menge, die in einer anderen Datei definiert ist.@ Bashar: Da ich keine Ahnung von Makefiles und von Ruby in C++ habe, fällt das (erstmal) für weg

-
Wurstinator schrieb:
@ CStoll: Wieso dürfte die aufwändiger sein? Entweder es gibt die Möglichkeit, die Dateien zur Compilezeit zu lesen oder es gibt sie nicht.?
Ich hätte da eine Idee (Stichwort: Resourcen), aber bei der müsstest du noch Hilfscode schreiben, um daraus dein Array zu erzeugen. Wobei die meisten Lösungen wohl auf Abwandlungen von Pi's Präprozessor-Variante hinauslaufen dürften.
-
Wurstinator schrieb:
@ Bashar: Da ich keine Ahnung von Makefiles und von Ruby in C++ habe, fällt das (erstmal) für weg

Du kannst das "Script" auch in C++ schreiben, wenn du willst. Wird halt ein bisschen anstrengender, aber du wolltest die Textdatei ja ursprünglich sowieso mit C++-Code "zur Compilezeit" parsen.
Und wenn du kein Make verwendest, verwendest du bestimmt irgendein anderes Build-Tool oder eine IDE. Beim Visual Studio kann man z.b. "Custom Build Steps" einfügen.(Wie kommst du eigentlich darauf, dass der Benutzer das nicht ändern kann, wenn es im Programm eincompiliert ist?)
-
Du könntest dir ja einen Prä-Präprozessor basteln.
-
@ CStoll: Meinst du, die txt-Dateien als Resource in die Executable zu packen?
@ Bashar:
Du kannst das "Script" auch in C++ schreiben, wenn du willst. Wird halt ein bisschen anstrengender, aber du wolltest die Textdatei ja ursprünglich sowieso mit C++-Code "zur Compilezeit" parsen.
Und wie würde das aussehen?
Und wenn du kein Make verwendest, verwendest du bestimmt irgendein anderes Build-Tool oder eine IDE. Beim Visual Studio kann man z.b. "Custom Build Steps" einfügen.
Visual Studio nutze ich. Die "Custom Build Steps" sehe ich mir mal an.
(Wie kommst du eigentlich darauf, dass der Benutzer das nicht ändern kann, wenn es im Programm eincompiliert ist?)
Weil die Nutzer sich in ihrer Freizeit nicht mit Disassemblierung beschäftigen.
@ 314159265358979: Was meinst du damit? Kannst du mir ein kleines Beispiel zeigen?
-
Wurstinator schrieb:
@ 314159265358979: Was meinst du damit? Kannst du mir ein kleines Beispiel zeigen?
Du sollst dir ein Programm schreiben, welches dir dein Programm schreibt. Das klingt kompliziert, sollte aber recht einfach sein.
-
Wenn es so einfach ist, kann mir doch jemand ein Beispiel zeigen?

Ich weiß nämlich nicht, wie das auszusehen hat.