当前位置:  开发笔记 > 编程语言 > 正文

C++多行字符串文字

如何解决《C++多行字符串文字》经验,为你挑选了8个好方法。

有什么方法可以在C++中使用多行纯文本,常量文字,还有Perl?也许有一些#include文件的解析技巧?我想不出一个,但男孩,那会很好.我知道它将在C++ 0x中.



1> unwind..:

嗯...排序.最简单的方法是使用编译器连接相邻字符串文字的事实:

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

缩进无关紧要,因为它不在引号内.

您也可以这样做,只要您注意逃避嵌入式换行符.不这样做,就像我的第一个答案那样,将无法编译:

const char *text2 =
  "Here, on the other hand, I've gone crazy \
and really let the literal span several lines, \
without bothering with quoting each line's \
content. This works, but you can't indent.";

再次注意每行末尾的反斜杠,它们必须紧接在行结束之前,它们正在转换源中的换行符,以便所有内容都像新行一样.您没有在反斜杠的位置获取字符串中的换行符.使用这种形式,你显然不能缩进文本,因为缩进将成为字符串的一部分,用随机空格拼写它.


@Jason:它不一定是C89之前编译器的一部分,但它在C89中定义,因此基本上在任何地方都受支持.
另外,如果你真的想要在c ++ 98中多行格式化的字符串,只需用\n代替每个引用的字符串片段上的终止空格.C++ 11原始文字仍然是我的最爱.
@unwind注意源行末尾的换行符不是字符串的一部分,只是跳过它.如果您想要换行作为字符串的一部分,则需要在行尾添加\n \.
我曾经被告知第一个选项可以实现,但是我还没有找到一个不尊重该语法的编译器.

2> emsr..:

在C++ 11中,您有原始字符串文字.类似于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";

保留字符串中的所有空格和缩进以及换行符.

这些也可以是utf-8 | 16 | 32或wchar_t(使用通常的前缀).

我应该指出,这里实际上并不需要转义序列V0G0N.它的存在将允许"在弦内".换句话说,我可以放

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

(注意额外的引号)和上面的字符串仍然是正确的.否则我也可以使用

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

引号内的parens仍然需要.


这正是我想要的,能够避免引号,反斜杠,Ns,转义,并且仍然在实际字符串中出现换行符.这对于嵌入式代码(例如着色器或Lua)非常方便.不幸的是,我们还没有使用C++ - 0x.:-(
这应该是公认的答案.这个规则.
@rsethc只需使用`#if 0` ...`#endif`来注释掉代码块.也是巢.
我更习惯铿锵和gcc.在这个编译器中,你必须为C++ 0x或c ++ 11设置一个标志.看看MS网站看起来他们还没有原始文字.据我所知,随着C++功能的实施,MS将更快地发布新的编译器更新.查找Visual C++编译器2012年11月CTP [http://www.microsoft.com/en-us/download/details.aspx?id=35515]了解最新资料.

3> 小智..:

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



4> bcmpinc..:

输入多行字符串的一种可能方便的方法是使用宏.仅当引号和括号平衡且不包含"顶级"逗号时才有效:

#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__允许使用,.


如果希望字符串包含逗号,可以使用`#define MULTILINE(...)#__ VA_ARGS__`.
请注意,这将删除大多数额外的whitesapce(包括所有`\n`和`\ r``),这对某些情况来说很方便,而对其他情况则是致命的.

5> Eric..:

你可以这样做:

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



6> Andreas Spin..:

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

#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__不处理逗号分隔符.所以你可以把它传递给stringizing运算符.修剪前导和尾随空格,然后将单词之间的空格(包括换行符)压缩为单个空格.括号需要平衡.我认为这些缺点解释了为什么C++ 11的设计者#__VA_ARGS__看到了对原始字符串文字的需求.



7> Raydelto Her..:

您也可以这样做:

const char *longString = R""""(
This is 
a very 
long 
string
)"""";


谢谢,这很棒,甚至在C语言中也可以工作。显然,`char longString [] = R“”“((这是一个很长的字符串)”“”“; 对我来说也可以。

8> CXJ..:

只是为了阐明@smsr在@ unwind的答案中的评论,如果一个人不幸有一个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的简短评论并没有在我第一次读到这篇文章时突然出现,所以我必须自己发现这个.希望我能在几分钟内拯救别人.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有