如何编写一个包含双引号的字符串字面量

14
我需要将以下C#代码转换成C++(如果可能的话)。我需要用很多引号和其他内容初始化一个长字符串。
// C# verbatim string
const String _literal = @"I can use "quotes" inside here";

1
为什么不从文件中加载这样长的字符串? - GManNickG
4个回答

35

这在C++03(当前的标准)中不可用。

这是C++0x草案标准的一部分,但目前还不容易获得。

现在,你只需要显式地引用它:

const std::string _literal = "I have to escape my quotes in \"C++03\"";

一旦C++0x成为现实,你将能够编写:

Once C++0x becomes reality, you'll be able to write:
const std::string _literal = R"(but "C++0x" has raw string literals)";

当您需要在文字字面值中包含 )" 时:

const std::string _literal = R"DELIM(more "(raw string)" fun)DELIM";

@paxdiablo - 不用谢。顺便说一下,我之前的例子是不正确的。原始字符串使用括号而不是方括号作为分隔符。此外,原始字符串比我的示例显示的更具灵活性(您可以添加分隔符,以便在实际字符串中放置)")。 - R Samuel Klatchko

7

C++ 中没有类似于 C# 的 "@" 符号。唯一的方式就是正确转义字符串:

const char *_literal = "I can use \"quotes\" inside here";

5

C++中没有原始字符串字面量。您需要转义字符串字面量。

std::string str = "I can use \"quotes\" inside here";

C++0x提供了原始字符串字面量,当它可用时:

R"C:\mypath"

顺便提一下,在C++中应避免使用以下划线开头的命名,因为这些标识符是保留的。


以下划线开头,然后紧跟大写字母的名称为实现保留名称,任何情况下都不能使用它们。以下划线开头的名称通常仅在全局命名空间中作为名称保留。 - Dennis Zickefoose
1
@Brian - 原始字符串使用括号 R"(C:\mypath)" - R Samuel Klatchko

2

C++中没有这样的机制。您需要使用转义字符来完成。

您可能可以使用脚本语言来使转义部分变得更加容易。例如,在Ruby中,使用%Q操作符将在irb中返回一个正确转义的双引号字符串:

irb(main):003:0> %Q{hello "world" and stuff     with    tabs}
=> "hello \"world\" and stuff\twith\ttabs"

你是认真建议在C++程序中嵌入Ruby解释器来转义字符串吗? - jalf
@jalf:绝对不是这样!我建议先将字符串粘贴到Ruby中,然后再将结果粘贴回他的源文件。虽然我可以理解我的答案可能会被解释成那种荒谬的方式。 - Mark Rushakoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接