Est-il possible d’avoir des littéraux de texte brut, constants multiligne dans C++, à la Perl ? Peut-être que certains truc analyse avec `` ing un fichier ? Je ne peux pas penser un, mais le garçon, ce serait sympa. Je sais que ça va être dans C ++0 x.
Réponses
Trop de publicités?Bien ... en quelque Sorte. Le plus simple est d'utiliser le fait que adjacentes littéraux de chaîne sont concaténés par le compilateur:
const char *text =
"This text is pretty long, but will be "
"concatenated into just a single string. "
"The disadvantage is that you have to quote "
"each part, and newlines must be literal as "
"usual.";
L'indentation n'a pas d'importance, puisqu'il n'est pas à l'intérieur des citations.
Vous pouvez également le faire, aussi longtemps que vous prenez soin d'échapper à la embarqués retour à la ligne. À défaut de le faire, comme ma première réponse n', ne compile pas:
const char *text2 =
"Here, on the other hand, I've gone crazy \
and really let the literal span several lines, \
without bothering with quoting each line's \
content. This works, but you can't indent.";
De nouveau, notez les barres obliques inverses à la fin de chaque ligne, ils doivent être immédiatement avant que la ligne se termine, ils tentent d'échapper à la nouvelle ligne dans le source, faisant partie de la chaîne littérale. Avec ce formulaire, vous ne pouvez pas mettre en retrait le texte depuis le retrait deviendrait alors une partie de la chaîne, de la rendre méconnaissable avec aléatoire espaces.
Dans C++0x vous avez cru littéraux de chaîne. Un peu comme ici-texte en coquilles et des langages de script comme Python et Perl et Ruby.
const char * vogon_poem = R"V0G0N(
O freddled gruntbuggly thy micturations are to me
As plured gabbleblochits on a lurgid bee.
Groop, I implore thee my foonting turlingdromes.
And hooptiously drangle me with crinkly bindlewurdles,
Or I will rend thee in the gobberwarts with my blurlecruncheon, see if I don't.
(by Prostetnic Vogon Jeltz; see p. 56/57)
)V0G0N";
Tous les espaces et à l'indentation et les retours à la ligne dans la chaîne sont conservés.
Ceux-ci peuvent également être en utf-8/16/32 ou wchar_t (avec l'habitude préfixes).
Je tiens à souligner que la séquence d'échappement, V0G0N, n'est en fait pas nécessaire ici. Sa présence permettrait de mettre )" à l'intérieur de la chaîne. En d'autres termes, j'aurais pu mettre
"(by Prostetnic Vogon Jeltz; see p. 56/57)"
(note de guillemets supplémentaires) et la chaîne ci-dessus serait toujours correct. Sinon, je pourrais aussi bien avoir utilisé
const char * vogon_poem = R"( ... )";
Les parenthèses à l'intérieur des guillemets sont encore nécessaires.
Un moyen pratique de saisir plusieurs lignes de chaînes de caractères est par l'aide de la macro. Cela ne fonctionne que si les guillemets et les parenthèses sont équilibrés et qu'il ne contient pas de haut niveau par des virgules:
#define MULTI_LINE_STRING(a) #a
const char *text = MULTI_LINE_STRING(
Using this trick(,) you don't need to use quotes.
Though newlines and multiple white spaces
will be replaced by a single whitespace.
);
printf("[[%s]]\n",text);
Compilé avec gcc 4.6 ou g++ 4.6, cela donne: [[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 l' ,
ne peut pas être dans la chaîne, sauf si elle est contenue à l'intérieur de parenthèses ou guillemets. Les guillemets simples est possible, mais crée les avertissements du compilateur.
Edit: Comme mentionné dans les commentaires, #define MULTI_LINE_STRING(...) #__VA_ARGS__
permet l'utilisation d' ,
.