581 Stimmen

C++ mehrzeiliges String-Literal

Gibt es eine Möglichkeit, mehrzeilige Klartextliterale in C++ zu verwenden, wie in Perl? Vielleicht ein Parsing-Trick mit #include in einer Datei? Mir fällt keine ein, aber Junge, das wäre schön. Ich weiß, dass es in C++0x sein wird.

2 Stimmen

Im Allgemeinen sollten Sie keine Stringliterale in den Code einbetten. Für I18N und L10N ist es besser, String-Literale in eine Konfigurationsdatei zu schreiben, die zur Laufzeit geladen wird.

63 Stimmen

Es gibt genügend Fälle, in denen das Einfügen von String-Literalen in den Code kein Problem darstellt: wenn der String nicht verwendet wird, um ihn dem Benutzer darzustellen; d.h.: SQL-Anweisungen, Dateinamen, Namen von Registrierungsschlüsseln, auszuführende Befehlszeilen, ...

4 Stimmen

@Martin: Es kann aber trotzdem nützlich sein, das zu wissen. Ich habe es zum Beispiel gemacht, um komplexe Regexe aufzulösen.

31voto

Eric Punkte 6166

Sie können dies einfach tun:

const char *text = "This is my string it is "
     "very long";

1 Stimmen

Was ist der Unterschied zu @unwinds Antwort?

24 Stimmen

@Sisir Ich habe es 2 Minuten vor unwind gepostet.

15voto

CXJ Punkte 4087

Nur um den Kommentar von @emsr in der Antwort von @unwind etwas zu erläutern: Wenn man nicht das Glück hat, einen C++11-Compiler zu haben (z. B. GCC 4.2.1), und man die Zeilenumbrüche in die Zeichenkette (entweder char * oder class string) einbetten möchte, kann man etwas wie folgt schreiben:

const char *text =
  "This text is pretty long, but will be\n"
  "concatenated into just a single string.\n"
  "The disadvantage is that you have to quote\n"
  "each part, and newlines must be literal as\n"
  "usual.";

Das ist zwar sehr offensichtlich, aber der kurze Kommentar von @emsr ist mir beim ersten Lesen nicht sofort ins Auge gesprungen, so dass ich das selbst entdecken musste. Hoffentlich habe ich jemand anderem ein paar Minuten erspart.

13voto

user3635122 Punkte 118
// C++11. 
std::string index_html=R"html(
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>VIPSDK MONITOR</title>
    <meta http-equiv="refresh" content="10">
</head>
<style type="text/css">
</style>
</html>
)html";

22 Stimmen

Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu und nicht nur Codeschnipsel

12voto

Andreas Spindler Punkte 6601

Da eine Unze Erfahrung mehr wert ist als eine Tonne Theorie, habe ich ein kleines Testprogramm für MULTILINE :

#define MULTILINE(...) #__VA_ARGS__

const char *mstr[] =
{
    MULTILINE(1, 2, 3),       // "1, 2, 3"
    MULTILINE(1,2,3),         // "1,2,3"
    MULTILINE(1 , 2 , 3),     // "1 , 2 , 3"
    MULTILINE( 1 , 2 , 3 ),   // "1 , 2 , 3"
    MULTILINE((1,  2,  3)),   // "(1,  2,  3)"
    MULTILINE(1
              2
              3),             // "1 2 3"
    MULTILINE(1\n2\n3\n),     // "1\n2\n3\n"
    MULTILINE(1\n
              2\n
              3\n),           // "1\n 2\n 3\n"
    MULTILINE(1, "2" \3)      // "1, \"2\" \3"
};

Kompilieren Sie dieses Fragment mit cpp -P -std=c++11 filename zu reproduzieren.

Der Trick dahinter #__VA_ARGS__ ist das __VA_ARGS__ verarbeitet das Komma-Trennzeichen nicht. Sie können es also an den Stringisierungsoperator übergeben. Führende und nachfolgende Leerzeichen werden abgeschnitten, und Leerzeichen (einschließlich Zeilenumbrüche) zwischen Wörtern werden auf ein einziges Leerzeichen komprimiert. Parenthesen müssen ausgeglichen werden. Ich denke, diese Unzulänglichkeiten erklären, warum die Entwickler von C++11, trotz #__VA_ARGS__ sah die Notwendigkeit für rohe String-Literale.

-7voto

piyu2cool Punkte 33

Option 1. Mit der boost-Bibliothek können Sie die Zeichenfolge wie folgt deklarieren

const boost::string_view helpText = "This is very long help text.\n"
      "Also more text is here\n"
      "And here\n"

// Pass help text here
setHelpText(helpText);

Möglichkeit 2. Wenn boost in Ihrem Projekt nicht verfügbar ist, können Sie std::string_view() in modernem C++ verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X