C ++多行string

有什么办法可以在C ++中使用多行的纯文本,常量字面值? 也许一些parsing窍门#include一个文件? 我想不出一个,但是男孩,那很好。 我知道它将在C ++ 0x。

那么…sorting。 最简单的就是使用相邻string文字由编译器连接的事实:

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

缩进并不重要,因为它不在引号内。

你也可以这样做,只要你注意逃避embedded的换行符。 不这样做,就像我的第一个答案一样,不会编译:

 const char * text2 =
   “另一方面,在这里我疯了,
真正让字面跨越几行,
不用费心去引用每一行的\
内容。 这个工作,但你不能缩进。“;

再次注意,每行末尾的反斜杠,它们必须在行结束之前立即跳出源代码中的换行符,这样所有行都像换行符不在那里一样。 在你有反斜杠的地方,你不会在string中出现换行符。 使用这种forms,显然不能缩进文本,因为缩进会成为string的一部分,用随机空格来剔除。

在C ++ 11中,你有原始的string文字。 有点像这里 – shell和脚本语言,如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"; 

string中的所有空格和缩进以及换行都将被保留。

这些也可以是utf-8 | 16 | 32或wchar_t(带有通常的前缀)。

我应该指出,转义序列V0G0N在这里并不需要。 它的存在将允许“放在弦内”,换句话说,我可以放下

  "(by Prostetnic Vogon Jeltz; see p. 56/57)" 

(注意多余的引号),上面的string仍然是正确的。 否则,我也可以使用

 const char * vogon_poem = R"( ... )"; 

报价单内的人员仍然需要。

#define MULTILINE(...) #__VA_ARGS__
消耗括号内的所有内容。
用单个空格replace任意数量的连续空格字符。

input多行string的一种可能方便的方法是使用macros。 这只适用于引号和括号是平衡的,它不包含“顶级”逗号:

 #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.]] [[Using this trick(,) you don't need to use quotes. Though newlines and multiple white spaces will be replaced by a single whitespace.]]

请注意,不能在string中,除非它包含在括号或引号内。 单引号是可能的,但会产生编译器警告。

编辑:正如在评论中提到的, #define MULTI_LINE_STRING(...) #__VA_ARGS__允许使用,

你可以这样做:

 const char *text = "This is my string it is " "very long"; 

由于一盎司的经验值得大量的理论,我试了一下MULTILINE一个testing程序:

 #define MULTILINE(...) #__VA_ARGS__ const char *mstr[] = { MULTILINE(1, 2, 3), // "1, 2, 3" MULTILINE(1,2,3), // "1,2,3" MULTILINE(1 , 2 , 3), // "1 , 2 , 3" MULTILINE( 1 , 2 , 3 ), // "1 , 2 , 3" MULTILINE((1, 2, 3)), // "(1, 2, 3)" MULTILINE(1 2 3), // "1 2 3" MULTILINE(1\n2\n3\n), // "1\n2\n3\n" MULTILINE(1\n 2\n 3\n), // "1\n 2\n 3\n" MULTILINE(1, "2" \3) // "1, \"2\" \3" }; 

cpp -P -std=c++11 filename编译这个片段来重现。

#__VA_ARGS__后面的#__VA_ARGS____VA_ARGS__不处理逗号分隔符。 所以你可以把它传递给string操作符。 前后空格被裁剪,然后单词之间的空格(包括换行符)被压缩到一个空格。 括号需要平衡。 我认为这些缺点解释了为什么C ++ 11的devise者尽pipe#__VA_ARGS__看到了对原始string文字的需求。

只是为了阐明@ emsr在@ unwind的答案中的一些评论,如果没有足够的C ++ 11编译器(比如GCC 4.2.1),并且想要在string中embedded换行符(char *或类string),可以写这样的东西:

 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的简短评论没有跳出来,所以我必须为自己find这个。 希望我已经救了别人几分钟。