类似于打印END<<结束;在C ++中?

时间:2009-10-10 21:59:18

标签: c++ string-literals

无论如何都要做像PHP这样的事情

print << END
yadayadayada
END;

在C ++中? (多线,未转义,易于切割和粘贴的流插入)

8 个答案:

答案 0 :(得分:26)

C ++ 11具有原始string literals

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

如果你需要那些parens,你也可以使用你想要的任何结束标记来做到这一点:

// 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" 

答案 1 :(得分:10)

这个答案现在已经过时了现代C ++ - 请参阅sbi's answer了解现代方式。

这是你能做的最好的事情:

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

不如正确的heredoc方便,但并不可怕。

答案 2 :(得分:8)

在C ++中,将大量数据放入源代码通常不会被视为代码风格,因此没有一种奇特的语言方式。

将文本放入外部文件(例如文本文件)通常更灵活,然后它不会绑定到已编译的可执行文件中。

如果您确实希望将文本绑定到可执行文件中(取决于您的平台),您通常可以使用某种形式的 resource 支持,或者使用带有'incbin'样式指令的汇编程序使用您想要的文本为数据区域命名。

或者,您可以使用外部实用程序(例如xxd -i)从给定的输入文件编译命名的C样式数组。然后可以使用其余的源代码编译生成的文件。

答案 3 :(得分:4)

是。 http://en.cppreference.com/w/cpp/language/string_literal

const char* s1 = R"foo(
Hello
World
)foo";
//same as
const char* s2 = "\nHello\nWorld\n";

无论是否是最佳实践,C ++ 11都能完全满足您的需求。

答案 4 :(得分:1)

你可以这样做:

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

这是你用C ++做的最好的事情。

答案 5 :(得分:0)

C ++中没有HEREDOC这样的东西。

你可以做到

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

这是你能得到的最好的。但你仍然必须逃脱像\,“,”这样的特殊字符。

将文本作为资源包含在可执行文件中或从外部文件加载文本的方式。

答案 6 :(得分:0)

行尾的斜杠表示下一行是字符串的延续。这会引导您使用替代语法,您可能不喜欢或不喜欢其他建议:

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

优点:你不必用引号括起每一行;从其他来源导入文本时,您只需要编辑每一行的一端,而不是两端(更友好的宏);并且您可以确切地看到结果字符串的外观,包括前导空格。

缺点:你仍然必须明确地包含\ n for换行符,并且我不喜欢失去使代码变得漂亮和漂亮的能力。 HEREDOC语法也受此功能的影响,所以也许这不会打扰你。

就个人而言,这不是我喜欢的语法。

答案 7 :(得分:-1)

如果我理解正确,我相信你想要这个:

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