497

Perl 風に C++ で複数行のプレーンテキスト定数リテラルを使用する方法はありますか? たぶん#include、ファイルを使用した解析のトリックですか?思いつきませんが、少年、それはいいでしょう。C++0x になることはわかっています。

4

10 に答える 10

519

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"( ... )";

引用符のすぐ内側の親はまだ必要です。

于 2011-03-28T14:11:47.070 に答える
30

#define MULTILINE(...) #__VA_ARGS__
括弧内のすべてを消費します。
任意の数の連続する空白文字を単一のスペースに置き換えます。

于 2013-01-12T13:08:46.833 に答える
28

複数行の文字列を入力する便利な方法は、マクロを使用することです。これは、引用符と括弧のバランスが取れていて、「最上位」のコンマが含まれていない場合にのみ機能します。

#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__の使用を許可します,

于 2012-04-03T18:21:42.513 に答える
13

@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の短いコメントは、これを初めて読んだときに飛び出さなかったので、自分でこれを発見する必要がありました. うまくいけば、私は他の誰かを数分節約しました。

于 2013-01-15T22:01:24.947 に答える