Perl 風に C++ で複数行のプレーンテキスト定数リテラルを使用する方法はありますか? たぶん#include
、ファイルを使用した解析のトリックですか?思いつきませんが、少年、それはいいでしょう。C++0x になることはわかっています。
10 に答える
C ++ 11には、生の文字列リテラルがあります。一種のヒアドキュメント-Python、Perl、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";
文字列内のすべてのスペースとインデントおよび改行は保持されます。
これらは、utf-8 | 16 | 32またはwchar_t(通常のプレフィックス付き)にすることもできます。
ここでは、エスケープシーケンスV0G0Nは実際には必要ないことを指摘しておく必要があります。その存在は文字列の中に) "を入れることを可能にするでしょう。言い換えれば、私は置くことができたでしょう
"(by Prostetnic Vogon Jeltz; see p. 56/57)"
(余分な引用符に注意してください)そして上記の文字列はまだ正しいでしょう。そうでなければ私も同じように使用することができます
const char * vogon_poem = R"( ... )";
引用符のすぐ内側の親はまだ必要です。
#define MULTILINE(...) #__VA_ARGS__
括弧内のすべてを消費します。
任意の数の連続する空白文字を単一のスペースに置き換えます。
複数行の文字列を入力する便利な方法は、マクロを使用することです。これは、引用符と括弧のバランスが取れていて、「最上位」のコンマが含まれていない場合にのみ機能します。
#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);
gcc 4.6 または g++ 4.6 でコンパイルすると、次のようになります。[[Using this trick(,) you don't need to use quotes. Though newlines and multiple white spaces will be replaced by a single whitespace.]]
,
を括弧または引用符で囲まない限り、文字列に含めることはできないことに注意してください。一重引用符は使用できますが、コンパイラの警告が作成されます。
編集:コメントで述べたように、#define MULTI_LINE_STRING(...) #__VA_ARGS__
の使用を許可します,
。
@unwindの回答で@emsrのコメントを少し説明するために、C ++ 11コンパイラ(GCC 4.2.1など)を使用できるほど幸運ではなく、文字列に改行を埋め込みたい場合(char *またはクラス文字列)、次のように書くことができます:
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.";
非常に明白ですが、@emsrの短いコメントは、これを初めて読んだときに飛び出さなかったので、自分でこれを発見する必要がありました. うまくいけば、私は他の誰かを数分節約しました。