C ++ mehrzeiliges Zeichenfolgenliteral
Gibt es eine Möglichkeit zu multi-line-text -, Konstanten-Literale in C++, à-la-Perl? Vielleicht ein paar parsing-trick mit #include
ing Datei? Ich kann nicht von einem denken, aber junge, junge, das wäre schön. Ich weiß, dass es in C++0x.
InformationsquelleAutor der Frage rlbond | 2009-07-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut ... irgendwie. Das einfachste ist einfach die Tatsache, dass benachbarte string-Literale sind verkettet durch den compiler:
Den Einzug egal ist, da es nicht innerhalb der Anführungszeichen.
Können Sie dies auch tun, so lange wie Sie kümmern sich um die Flucht der eingebetteten newline. Versagen zu tun, so, wie meine erste Antwort hat, wird nicht kompilieren:
Wieder, beachten Sie diejenigen, die backslashes am Ende der Zeile, müssen Sie unmittelbar vor der Zeile endet, Sie werden die Flucht der Zeilenumbruch in der Quelle, so dass alles, was wirkt, als ob der Zeilenumbruch nicht da war. Bekommen Sie keine Zeilenumbrüche im string an den Standorten, an denen Sie hatte backslashes. Mit diesem Formular können Sie offensichtlich nicht Einrücken text, da der Einzug wäre dann Teil der string-Verstümmelung mit zufälligen Räume.
InformationsquelleAutor der Antwort unwind
In C++11 haben Sie raw-string-Literale. So in der Art wie hier-text in shells und Skriptsprachen wie Python und Perl und Ruby.
Alle Leerzeichen und Einrückungen und die Zeilenumbrüche in der Zeichenkette erhalten.
Können diese auch als utf-8/16/32 oder wchar_t (mit den üblichen Präfixen).
Sollte ich darauf hinweisen, dass die escape-Sequenz, V0G0N, ist nicht wirklich nötig hier. Seine Präsenz würde es erlauben, putting )" innerhalb der Zeichenfolge. In anderen Worten, ich hätte
(Hinweis: zusätzlichen Anführungszeichen) und der string würde nicht immer noch richtig sein. Sonst könnte ich genauso gut verwendet
Den Klammern nur innerhalb der Anführungszeichen werden benötigt.
InformationsquelleAutor der Antwort emsr
#define MULTILINE(...) #__VA_ARGS__
Verbraucht alles, was zwischen den Klammern.
Ersetzt eine beliebige Anzahl aufeinanderfolgender whitespace-Zeichen durch ein einzelnes Leerzeichen.
InformationsquelleAutor der Antwort Zlatan Stanojević
Wahrscheinlich ein bequemer Weg, um geben Sie multi-line-strings ist durch die Verwendung von Makros. Dies funktioniert nur, wenn Anführungszeichen und Klammern sind ausgewogen und enthält nicht 'top-level' Komma ' s:
Kompiliert mit gcc-4.6 oder g++ 4.6 ergibt sich:
[[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 die
,
nicht in den string, es sei denn, es ist enthalten in Klammern oder Anführungszeichen. Einzelne Zitate möglich ist, schafft aber eine compiler-Warnung.Edit: Wie bereits erwähnt in den Kommentaren,
#define MULTI_LINE_STRING(...) #__VA_ARGS__
ermöglicht die Verwendung von,
.InformationsquelleAutor der Antwort bcmpinc
Können Sie genau dies tun:
InformationsquelleAutor der Antwort Eric
Da eine Unze Erfahrung ist es Wert eine Tonne Theorie, die ich habe versucht einen kleinen test-Programm für
MULTILINE
:Kompilieren Sie dieses fragment mit
cpp -P -std=c++11 filename
zu reproduzieren.Den trick, der hinter
#__VA_ARGS__
ist, dass__VA_ARGS__
verarbeitet nicht die Komma-Trennzeichen. So können Sie übergeben es an die stringizing Betreiber. Führende und nachfolgende Leerzeichen abgeschnitten werden, und die Räume (inklusive Zeilenumbrüche) zwischen den Wörtern komprimiert, auf ein einzelnes Leerzeichen dann. Klammern müssen ausgeglichen sein. Ich denke, diese Mängel zu erklären, warum die Entwickler von C++11, trotz#__VA_ARGS__
sah die Notwendigkeit für raw-string-Literale.InformationsquelleAutor der Antwort Andreas Spindler
Nur zu klären, ein bisschen auf @emsr-Kommentar in @entspannen Sie sich beantworten, wenn man nicht das Glück, einen C++11-compiler (z.B. GCC 4.2.1), und man einbetten möchte, die die Zeilenumbrüche in den string (char * oder die Klasse string), kann man schreiben etwas wie dieses:
Sehr offensichtlich, stimmt, aber @emsr kurzen Kommentar nicht springen heraus auf mich wenn ich lese das das erste mal, also ich musste feststellen das für mich. Hoffentlich hab ich gespeichert jemand anderes ein paar Minuten.
InformationsquelleAutor der Antwort CXJ