2009-10-10 17 views
9

PHPのC++で何かのような印刷END << END; C++で?

print << END 
yadayadayada 
END; 

のような何かをするとにかくはありますか? (複数行、エスケープ、簡単にカットアンドペーストストリーム挿入)

+2

これらは、/ bin/shと派生した言語では "Hereドキュメント"と呼ばれます。 – dmckee

答えて

9

この回答は現代的な方法では最新のC++ - sbi's answerを参照してください。

これは、あなたができる最善である:

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

適切なヒアドキュメントほど便利ではありませんが、ひどいではありません。

+8

これは本当に特別な複数行文字列構文ではないことに注意してください。 C言語とC++言語はソースコードの文字列リテラルを連結するので、これは 'std :: cout <<と同じです。これは\ nmultiline \ nstringです。 –

0

私が正しくあなたを理解していれば、私はあなたがこれをしたいと考えている:

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

私は恐れているが、私はそれをはっきりと説明していないと思う。私は、エスケープされていないテキストをcout(または任意のストリームに挿入)できるようにしたい。 PHPでは、私が言ったように(かなり間違っていました)、 "END;が見つかるまで、何かを正確に表示します。新しい行に、それ自身で。実際には宣言したい "deliminer"の終わりを使用することができますが、セミコロンで終わる必要があります。 –

1

あなたはこのように行うことができます。

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

これはC++でできることです。

+0

その答えは不可能だということですか? –

0

C++にはHEREDOCというものはありません。

あなたが得ることができる最高です

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

を行うことができます。しかし、あなたはまだ '、\、 "などの特殊文字をエスケープする必要があります。

の方法は、それが実行可能にressourceとしてテキストを含めるか、または外部ファイルからロードすることです。

C++で
8

、それはです大量のデータをソースコードに入れるために通常考えられるコードスタイルではないので、それを行うための素晴らしい言語方法はありません。

通常、テキストを外部ファイル(テキストファイル)、コンパイルされた実行可能ファイルにバインドされていません。

実行可能ファイルにテキストをバインドしたい場合は、(dependiあなたのプラットフォームでは、リソースサポートの何らかの形式を使用することもできますし、必要なテキストを含むデータ領域に名前を付けるために 'incbin'スタイルのディレクティブを持つアセンブラを使用することもできます。

また、外部ユーティリティ(xxd -iなど)を使用して、指定された入力ファイルから名前付きCスタイルの配列をコンパイルすることができます。生成されたファイルは、残りのソースコードとともにコンパイルすることができます。

+2

"C++では、大量のデータをソースコードに入れるために、通常はコードスタイルとは見なされていないので、それを行うための素晴らしい言語方法はありません。私はそれが理由を考えているとは思わないが、それを行う方法はないが、 'xxd'のために+1 –

+0

Mm、もっと意味がある場合がある。まともなユースケースです。一般的に言えば、あなたのプログラムソースにシェーダソースを埋め込むことは望ましくないでしょう(一般的には値をハードコードしたいと思う以上のものです)。しかし、これを「デフォルト」シェーダにしておくと、GLファイル操作による合併症からのテスト。 –

+0

(編集タイムアウトになります) - シェーダーソースには、HEREDOCまたは代替手段なしで行ごとに引用符と改行が必要です。 C + +以上のHEREDOCに対する議論ですか? IMHO文字列リテラル、手動改行、または外部プリプロセッサのどちらも 'エレガントな'ものではなく、決して気にしないものです。 汚れの中で8年間ポストを掘ると申し訳ありません。 –

22

C++ 11生string literalsがあります

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

そして、あなたはそれらの括弧が必要な場合、あなたはあなたが最後のトークンのために欲しいものは何でも使用して、あまりにも、それを行うことができます。

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

それ

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

しかし、私はまだ埋め込み改行を許可しないと思います。 – me22

+0

'string literal'の中で変数を使う方法はありますか? – Lanti

+2

@Lanti:明らかな答えは「いいえ」です。なぜなら、「リテラル」という用語は、値が_リテラルに解釈されることを意味するからです。しかし、私はあなたの質問があなたがしたいことを実際に述べることで改善できると考えています。 – sbi

0

次の行が連続していることを意味します文字列のオン。

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

利点:これはあなたがたりないかもしれない他の提案の上に好むかもしれない別の構文につながるあなたは引用符で各ラインをラップする必要はありません。他のソースからテキストをインポートするときには、両端ではなく、各行の一端を編集するだけで済みます(もっとマクロにやさしい)。先頭のスペースを含め、結果の文字列がどのように見えるかを正確に見ることができます。

短所:改行のために\ nを明示的に含める必要があります。私のコードをすごくかわいくインデントする能力を失うのは好きではありません。 HEREDOC構文もこの機能に苦しんでいるので、おそらくそれはあなたを煩わせることはありません。

個人的には、これは私が好きな構文ではありません。

+0

私はコメントのどこかでこれを言及しました - 改行の動作の実装ですか? 'R '( dfのように)' 'を表示し、結果に'' \ n ''が含まれています。私はここの奇妙な人のようです。 (C++ 11、GCC on Linux x64、重要な場合) –

関連する問題