Existe-t-il un moyen d'avoir du texte brut multi-lignes, des littéraux constants en C ++, à la Perl? Peut-être une astuce d'analyse avec #include
un fichier? Je ne peux pas penser à un, mais mon garçon, ce serait bien. Je sais que ce sera en C ++ 0x.
c++
string-literals
rlbond
la source
la source
Réponses:
Eh bien ... en quelque sorte. Le plus simple est d'utiliser simplement le fait que les littéraux de chaîne adjacents sont concaténés par le compilateur:
L'indentation n'a pas d'importance, car elle n'est pas à l'intérieur des guillemets.
Vous pouvez également le faire, tant que vous prenez soin d'échapper à la nouvelle ligne intégrée. Ne pas le faire, comme ma première réponse, ne compilera pas:
Encore une fois, notez ces barres obliques inverses à la fin de chaque ligne, elles doivent être immédiatement avant la fin de la ligne, elles échappent à la nouvelle ligne dans la source, de sorte que tout se passe comme si la nouvelle ligne n'était pas là. Vous n'obtenez pas de sauts de ligne dans la chaîne aux emplacements où vous avez eu des barres obliques inverses. Avec ce formulaire, vous ne pouvez évidemment pas mettre le texte en retrait car le retrait deviendrait alors une partie de la chaîne, le brouillant avec des espaces aléatoires.
la source
En C ++ 11, vous avez des littéraux de chaîne bruts. Un peu comme du texte ici dans des shells et des langages de script comme Python et Perl et Ruby.
Tous les espaces et indentations et les sauts de ligne dans la chaîne sont conservés.
Ceux-ci peuvent également être utf-8 | 16 | 32 ou wchar_t (avec les préfixes habituels).
Je dois souligner que la séquence d'échappement, V0G0N, n'est pas réellement nécessaire ici. Sa présence permettrait de mettre) "à l'intérieur de la chaîne. En d'autres termes, j'aurais pu mettre
(notez les guillemets supplémentaires) et la chaîne ci-dessus serait toujours correcte. Sinon j'aurais tout aussi bien pu utiliser
Les parens juste à l'intérieur des guillemets sont toujours nécessaires.
la source
#if 0
…#endif
pour commenter des blocs de code. Nid aussi.#define MULTILINE(...) #__VA_ARGS__
Consomme tout entre les parenthèses.
Remplace n'importe quel nombre de caractères d'espaces consécutifs par un seul espace.
la source
\n
si vous avez besoin de nouvelles lignes` (and hence
\ n) is copied literally, but
"` est converti en\"
. DoncMULTILINE(1, "2" \3)
donne"1, \"2\" \3"
.Un moyen probablement pratique pour saisir des chaînes multilignes consiste à utiliser des macros. Cela ne fonctionne que si les guillemets et les parenthèses sont équilibrés et ne contient pas de virgules de «haut niveau»:
Compilé avec gcc 4.6 ou g ++ 4.6, cela produit:
[[Using this trick(,) you don't need to use quotes. Though newlines and multiple white spaces will be replaced by a single whitespace.]]
Notez que le
,
ne peut pas être dans la chaîne, sauf s'il est contenu entre parenthèses ou guillemets. Les guillemets simples sont possibles, mais créent des avertissements du compilateur.Edit: Comme mentionné dans les commentaires,
#define MULTI_LINE_STRING(...) #__VA_ARGS__
permet l'utilisation de,
.la source
#define MULTILINE(...) #__VA_ARGS__
si vous souhaitez que votre chaîne contienne des virgules.\n
et\r
), ce qui est pratique pour certains cas et fatal pour d'autres.Vous pouvez également le faire:
la source
char longString[] = R""""( This is a very long string )"""";
ça marche aussi, pour moi.Vous pouvez simplement faire ceci:
la source
Puisqu'une once d'expérience vaut une tonne de théorie, j'ai essayé un petit programme de test pour
MULTILINE
:Compilez ce fragment avec
cpp -P -std=c++11 filename
pour le reproduire.L'astuce
#__VA_ARGS__
est qu'il__VA_ARGS__
ne traite pas le séparateur de virgules. Vous pouvez donc le transmettre à l'opérateur de stringizing. Les espaces de début et de fin sont supprimés, puis les espaces (y compris les retours à la ligne) entre les mots sont compressés en un seul espace. Les parenthèses doivent être équilibrées. Je pense que ces lacunes expliquent pourquoi les concepteurs de C ++ 11, malgré#__VA_ARGS__
, ont vu le besoin de littéraux de chaîne bruts.la source
Juste pour élucider un peu le commentaire de @ emsr dans la réponse de @ unwind, si l'on n'a pas la chance d'avoir un compilateur C ++ 11 (par exemple GCC 4.2.1), et qu'on veut incorporer les nouvelles lignes dans la chaîne (soit char * ou classe string), on peut écrire quelque chose comme ceci:
Très évident, c'est vrai, mais le bref commentaire de @ emsr ne m'a pas sauté aux yeux lorsque j'ai lu ceci la première fois, j'ai donc dû le découvrir par moi-même. J'espère que j'ai sauvé quelqu'un d'autre quelques minutes.
la source
la source
Option 1. En utilisant la bibliothèque boost, vous pouvez déclarer la chaîne comme ci-dessous
Option 2. Si boost n'est pas disponible dans votre projet, vous pouvez utiliser std :: string_view () en C ++ moderne.
la source