2009-10-10 11 views
9

Y at-il de toute façon de faire quelque chose comme PHP deQuelque chose comme print END << END; en C++?

print << END 
yadayadayada 
END; 

en C++? (Multi-ligne, déprotégés insertion de flux pâte et facile à couper)

+2

Ils sont appelés "ici documents" dans/bin/sh et les langages dérivés. – dmckee

Répondre

9

Cette réponse est maintenant périmée pour C++ moderne - voir sbi's answer pour la manière moderne.

C'est le meilleur que vous pouvez faire:

std::cout << 
    "This is a\n" 
    "multiline\n" 
    "string.\n"; 

pas aussi pratique comme heredoc bon, mais pas si terrible.

+8

Il convient de noter qu'il ne s'agit pas vraiment d'une syntaxe de chaîne multiligne spéciale. Les langages C et C++ concaténeront les littéraux de chaîne dans le code source, donc c'est identique à 'std :: cout <<" Ceci est une \ nmultiline \ nstring. \ N ";' à tous les égards (excepté la lisibilité). –

0

Si je vous comprends bien, je crois que vous voulez ceci:

#include <iostream> 
... 
std::cout << std::endl << "yadayadayada" << std::endl; 
+1

pas du tout j'ai peur, je suppose que je ne l'ai pas expliqué clairement. Je veux quelque chose qui peut couter (ou insérer dans n'importe quel flux) du texte UN-échappé. en PHP c'est fait comme je l'ai dit (im assez sûr, ça fait un moment), et ça va imprimer n'importe quoi exactement, jusqu'à ce qu'il trouve "END"; sur une nouvelle ligne, seul. en fait, vous pouvez utiliser n'importe quelle extrémité "délimiteur" que vous voulez déclarer, mais elle doit se terminer par un point-virgule et sur sa propre ligne. –

1

Vous pouvez faire comme ceci:

std::cout << "First line\n" 
"second line\n" 
"third line\n" ; 

Et c'est le meilleur que vous pouvez faire avec C++.

+0

alors la réponse est que c'est impossible? –

0

Il n'existe pas de HEREDOC en C++.

Vous pouvez faire

cout << 
"yadayadayada" 
"yadayadayada" 
<< endl; 

C'est le meilleur que vous pouvez obtenir. Mais vous reste à échapper les caractères spéciaux comme \ ",".

La voie serait-il d'inclure le texte comme une ressource dans l'exécutable ou le charger à partir d'un fichier externe.

8

En C++, il est Il n'est généralement pas considéré comme un style de code pour mettre de grandes quantités de données dans le code source, donc il n'y a pas de moyen de langage sophistiqué pour le faire

Il est généralement plus flexible de placer le texte dans un fichier externe (tel qu'un fichier texte)), alors il n'est pas lié dans l'exécutable compilé

Si vous voulez que le texte soit lié à l'exécutable alors (dépend ng sur votre plate-forme) vous pouvez souvent utiliser une forme de support ressource, ou un assembleur avec une directive de style 'incbin' pour donner un nom à une zone de données avec le texte que vous voulez.

Vous pouvez également utiliser un utilitaire externe (tel que xxd -i) pour compiler un tableau de style C nommé à partir d'un fichier d'entrée donné. Le fichier généré peut ensuite être compilé avec le reste du code source.

+2

"En C++, il n'est généralement pas considéré comme un style de code de mettre de grandes quantités de données dans le code source, donc il n'y a pas de moyen de langage sophistiqué pour le faire." Je ne pense pas que ce soit la raison pour laquelle il n'y a pas de façon élégante de le faire, mais +1 pour 'xxd' –

+0

Mm, il y a encore quelques cas où cela a plus de sens. Travailler avec les shaders est un cas d'utilisation décent; d'une manière générale, vous ne voudriez pas intégrer votre source de shader dans votre source de programme (pas plus que vous ne souhaiteriez coder en dur), mais faire cela pour un shader par défaut pourrait être une bonne pratique, sans parler de la séparation de GL test de complications avec des opérations de fichiers. –

+0

(Modification expirée) - source de shader aurait besoin de citations et de nouvelles lignes par ligne sans le HEREDOC ou alternative. Les arguments contre HEREDOC pour C++ ou plus sont-ils généraux? À mon humble avis, ni le littéral de chaîne, le saut de ligne manuel, ni les préprocesseurs externes ne sont «élégants», et encore moins «fantaisistes». Désolé de déterrer un poste 8 ans dans la saleté. –

22

11 C++ a cru string literals:

// this doesn't have '\n', but '\\' and 'n' 
R"(yada"yadayada\n)" 

Et si vous avez besoin de ces parens, vous pouvez le faire aussi, en utilisant tout ce que vous voulez pour un jeton final:

// the following will be "(yada)(yada)(yada)" 
R"END((yada)(yada)(yada))END" 

il fonctionne également avec les nouvelles lignes intégrées:

// the following will be "\n(yada)\n(yada)\n(yada)\n" 
R"END(
(yada) 
(yada) 
(yada) 
)END" 
+0

Mais je pense que cela ne permettra toujours pas les nouvelles lignes intégrées. – me22

+0

Existe-t-il un moyen d'utiliser des variables dans 'literals '? – Lanti

+2

@Lanti: La réponse évidente est non, puisque le terme "littéral" signifie que la valeur est interprétée _literally_. Mais je soupçonne que votre question pourrait être améliorée en indiquant ce que vous voulez faire. – sbi

0

Une barre oblique à la fin d'une ligne signifie que la ligne suivante est une ligne continue. de la chaîneCela vous conduit à une autre syntaxe que vous pouvez ou non préférerons autres suggestions:

std::cout << "\ 
This is a\n\ 
multiline\n\ 
string.\ 
"; 

Les avantages: vous ne devez pas envelopper chaque ligne entre guillemets; lors de l'importation de texte à partir d'une autre source, il vous suffit d'éditer une extrémité de chaque ligne, pas les deux extrémités (plus convivial pour les macros); et vous pouvez voir exactement à quoi ressemblera la chaîne résultante, y compris les espaces principaux. Les inconvénients: vous devez toujours inclure explicitement \ n pour les retours à la ligne, et je n'aime pas perdre la possibilité de mettre en retrait mon code sympa et joli. La syntaxe HEREDOC souffre également de cette fonctionnalité, alors peut-être que cela ne vous dérangera pas.

Personnellement, ce n'est pas une syntaxe que j'aime.

+0

Je l'ai mentionné ailleurs dans les commentaires - l'implémentation du comportement de la nouvelle ligne -/OS-defined ou quelque chose? J'imprime 'R '(comme df)" 'et le résultat inclut un'' \ n''. Je semble être l'étrange ici. (C++ 11, GCC sous Linux x64, si c'est important.) –

Questions connexes