2016-05-27 6 views
2

Ich habe eine Textdatei mit C-ähnlichem Klartext. Ich möchte, zur Kompilierzeit (und idealerweise mit cmake), nehmen Sie den Text in dieser Datei und verwenden Sie es, um eine einfache C++ - Header-Datei zu generieren - eine, die ein paar Includes, Namespace-Deklaration und eine Std :: String enthält Wert ist der Inhalt meiner Textdatei, neue Zeilen und alles inklusive.Verwandle eine Textdatei in eine Zeichenkette zur Kompilierzeit

Was ist der beste Weg, dies zu tun?

+0

Ein einfaches Shell-Skript sollte dazu in der Lage sein. Lesen Sie die Datei und schreiben Sie sie in die Initialisierung von 'std :: string varname =" ... ";'. Die Hauptsache ist, doppelte Anführungszeichen und Backslashes zu vermeiden. – Barmar

+0

@Barmar: Wahrscheinlich einfacher zu verwenden ein Raw String Literal (zumindest in den meisten Fällen). –

+0

Ich bin mir ziemlich sicher, dass dies ein Duplikat ist.Der einfachste Weg ist die Verwendung einer verschachtelten '# include'-Anweisung innerhalb einer rohen String-Literaldefinition. –

Antwort

0

Okay, also ging ich mit einer anderen Lösung als die hier vorgeschlagenen. Hier ist was ich getan habe.

In meinem Quellcode definiere ich eine Handler-Klasse, in der ich das String-Literal verwenden werde, das ich brauche. Zwei Dinge sind wichtig hier:

  • Die Header-Datei ist eigentlich eine .hpp.in während unter Versionskontrolle. Die Implementierungsdatei ist ein normales .cpp
  • Innerhalb dieser Header-Datei, habe ich eine Variable auswählen und #define es so: #define MY_STRING @[email protected]

nun im Innern des CMakeLists.txt verantwortlich für diese beiden Dateien, kann ich dies tun:

  • Lesen Sie die rohe Textdatei in eine Cmake Variable
  • alle // Kommentare entfernen, speichern Sie das Ergebnis in einer temporären variablen
  • alle ersetzen \n Zeichen mit der Zeichenfolge "newline", speichern Sie das Ergebnis in eine neue temporäre Variable
  • Definieren Sie die gleiche Variable, die ich oben in meinem Header verwendet (d. H. MY_STRING) und weisen Sie sie aus dieser neuesten temporären Variable
  • Kopieren Sie die Header von der seiner Lage unter $ {CMAKE_SOURCE_DIR} in die entsprechende Stelle unter $ {CMAKE_BINARY_DIR} (und es zu einem .hpp) Umbenennung @ONLY durch Angabe. Dies stellt sicher, dass cmake die Header-Datei kopiert, aber auch die #define MY_STRING @[email protected] mit dem Wert MY_STRING, den ich etwas früher gesetzt habe, aktualisiert.

schließlich in der Implementierung-Datei für meine Handler definiere ich die folgenden Makros:

#define STRINGIFY(x) #x 
#define TOSTRING(x) STRINGIFY(x) 

so dass ich TOSTRING(MY_STRING) nennen kann und die Ausgabe zu einem std::string my_string zuweisen. Sobald dies erledigt ist, muss ich nur die Platzhalterzeichenfolgen durch "\n" ersetzen - und fertig! my_string hat jetzt einen Wert, der dem in der Rohtextdatei entspricht (ohne die Kommentare dort).

Ich wünschte, ich hätte mehr Zeit, um damit zu spielen, und weniger andere Aufgaben, um mich abzulenken, aber die Art, wie die Dinge sind, wird dies für jetzt tun müssen.

Vielen Dank für Ihre Hilfe!

Verwandte Themen