16

反正有没有做类似 PHP 的事情

print << END
yadayadayada
END;

在 C++ 中?(多行、未转义、易于剪切和粘贴的流插入)

4

8 回答 8

39

C++11 具有原始字符串文字

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

如果你需要这些括号,你也可以这样做,使用任何你想要的结束令牌:

// 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" 
于 2009-10-10T22:27:36.487 回答
13

对于现代 C++,这个答案现在已经过时了 - 请参阅sbi对现代方式的回答。

这是你能做的最好的:

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

不像适当的heredoc那样方便,但并不可怕。

于 2009-10-10T22:03:50.703 回答
7

在 C++ 中,将大量数据放入源代码通常不被认为是代码风格,因此没有一种花哨的语言方式来做到这一点。

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

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

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

于 2009-10-10T22:12:13.963 回答
5

是的。 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 都能很好地满足您的需求。

于 2015-07-02T19:48:36.787 回答
1

你可以这样做:

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

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

于 2009-10-10T22:03:31.017 回答
0

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

你可以做

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

这是你能得到的最好的。但是您仍然必须转义特殊字符,例如 \,",'。

方法是将文本作为资源包含到可执行文件中或从外部文件加载。

于 2009-10-10T22:05:42.610 回答
0

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

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

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

缺点:你仍然必须明确地包含 \n 作为换行符,而且我不喜欢失去缩进我的代码的能力。HEREDOC 语法也受到此功能的影响,因此也许这不会打扰您。

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

于 2009-10-10T23:11:06.110 回答
-2

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

#include <iostream>
...
std::cout << std::endl << "yadayadayada" << std::endl;
于 2009-10-10T22:02:14.920 回答