Gibt es eine Möglichkeit, mehrzeilige, konstante Klartextliterale in C ++ à la Perl zu verwenden? Vielleicht ein Parsing-Trick mit #include
einer Datei? Ich kann mir keinen vorstellen, aber Junge, das wäre schön. Ich weiß, dass es in C ++ 0x sein wird.
c++
string-literals
rlbond
quelle
quelle
Antworten:
Naja, so ungefähr. Am einfachsten ist es, nur die Tatsache zu verwenden, dass benachbarte Zeichenfolgenliterale vom Compiler verkettet werden:
Die Einrückung spielt keine Rolle, da sie nicht in den Anführungszeichen steht.
Sie können dies auch tun, solange Sie darauf achten, den eingebetteten Zeilenumbruch zu umgehen. Wenn Sie dies nicht tun, wie es meine erste Antwort getan hat, wird Folgendes nicht kompiliert:
Beachten Sie auch hier diese Backslashes am Ende jeder Zeile. Sie müssen unmittelbar vor dem Ende der Zeile stehen und der neuen Zeile in der Quelle entkommen, damit sich alles so verhält, als ob die neue Zeile nicht vorhanden wäre. An den Stellen, an denen Sie Backslashes hatten, werden keine Zeilenumbrüche in der Zeichenfolge angezeigt. Mit diesem Formular können Sie den Text offensichtlich nicht einrücken, da der Einzug dann Teil der Zeichenfolge wird und mit zufälligen Leerzeichen versehen wird.
quelle
In C ++ 11 haben Sie rohe String-Literale. So ähnlich wie hier-Text in Shells und Skriptsprachen wie Python und Perl und Ruby.
Alle Leerzeichen und Einrückungen sowie die Zeilenumbrüche in der Zeichenfolge bleiben erhalten.
Dies können auch utf-8 | 16 | 32 oder wchar_t sein (mit den üblichen Präfixen).
Ich möchte darauf hinweisen, dass die Escape-Sequenz V0G0N hier eigentlich nicht benötigt wird. Seine Anwesenheit würde es ermöglichen, in die Saite zu setzen. Mit anderen Worten, ich hätte es setzen können
(zusätzliche Anführungszeichen beachten) und die obige Zeichenfolge wäre immer noch korrekt. Sonst hätte ich es genauso gut gebrauchen können
Die Parens direkt in den Anführungszeichen werden noch benötigt.
quelle
#if 0
...#endif
, um Codeblöcke zu kommentieren. Nester auch.#define MULTILINE(...) #__VA_ARGS__
Verbraucht alles zwischen den Klammern.
Ersetzt eine beliebige Anzahl aufeinanderfolgender Leerzeichen durch ein einzelnes Leerzeichen.
quelle
\n
wenn Sie Zeilenumbrüche benötigen` (and hence
\ n) is copied literally, but
"` in umgewandelt wird\"
. SoMULTILINE(1, "2" \3)
ergibt sich"1, \"2\" \3"
.Eine wahrscheinlich bequeme Möglichkeit, mehrzeilige Zeichenfolgen einzugeben, ist die Verwendung von Makros. Dies funktioniert nur, wenn Anführungszeichen und Klammern ausgeglichen sind und keine Kommas der obersten Ebene enthalten:
Kompiliert mit gcc 4.6 oder g ++ 4.6 ergibt dies:
[[Using this trick(,) you don't need to use quotes. Though newlines and multiple white spaces will be replaced by a single whitespace.]]
Beachten Sie, dass das
,
nicht in der Zeichenfolge enthalten sein kann, es sei denn, es ist in Klammern oder Anführungszeichen enthalten. Einfache Anführungszeichen sind möglich, erstellen jedoch Compiler-Warnungen.Bearbeiten: Wie in den Kommentaren erwähnt,
#define MULTI_LINE_STRING(...) #__VA_ARGS__
erlaubt die Verwendung von,
.quelle
#define MULTILINE(...) #__VA_ARGS__
wenn Ihre Zeichenfolge Kommas enthalten soll.\n
und\r
) entfernt werden, was in einigen Fällen praktisch und in anderen tödlich ist.Sie können dies auch tun:
quelle
char longString[] = R""""( This is a very long string )"""";
funktioniert auch für mich.Sie können dies einfach tun:
quelle
Da eine Unze Erfahrung eine Menge Theorie wert ist, habe ich ein kleines Testprogramm ausprobiert für
MULTILINE
:Kompilieren Sie dieses Fragment mit, um es
cpp -P -std=c++11 filename
zu reproduzieren.Der Trick dahinter
#__VA_ARGS__
ist, dass__VA_ARGS__
das Komma-Trennzeichen nicht verarbeitet wird. Sie können es also an den Stringing-Operator übergeben. Führende und nachfolgende Leerzeichen werden abgeschnitten, und Leerzeichen (einschließlich Zeilenumbrüche) zwischen Wörtern werden dann auf ein einzelnes Leerzeichen komprimiert. Klammern müssen ausgewogen sein. Ich denke, diese Mängel erklären, warum die Designer von C ++ 11 trotz#__VA_ARGS__
der Notwendigkeit roher String-Literale sahen.quelle
Nur um den Kommentar von @ emsr in der Antwort von @ unwind ein wenig zu erläutern, wenn man nicht das Glück hat, einen C ++ 11-Compiler zu haben (z. B. GCC 4.2.1) und die Zeilenumbrüche in den String einbetten möchte (entweder char * oder Klassenzeichenfolge) kann man so etwas schreiben:
Sehr offensichtlich, stimmt, aber der kurze Kommentar von @ emsr ist mir beim ersten Lesen nicht aufgefallen, also musste ich das selbst herausfinden. Hoffentlich habe ich jemand anderem ein paar Minuten gespart.
quelle
quelle
Option 1. Mit der Boost-Bibliothek können Sie die Zeichenfolge wie folgt deklarieren
Option 2. Wenn in Ihrem Projekt kein Boost verfügbar ist, können Sie std :: string_view () in modernem C ++ verwenden.
quelle