C++ 原生字符串字面量

2024 年 8 月 28 日 | 3 分钟阅读

什么是字符串字面量?

匿名字符串[1]或字符串字面量是计算机程序源代码中字符串值的字面表示。例如在 x = "foo" 中,"foo" 就是一个值为 foo 的字符串字面量。现代计算机语言通常使用一系列用引号括起来的字符,正式称为“括号分隔符”。通过使用转义序列等技术,可以避免分隔符冲突(括号问题),这些技术允许分隔符包含在字符串中。有许多替代表示法可用于定义字符串字面量,尤其是在复杂情况下。具体的表示法会因所讨论的计算机语言而异。但大多数现代编程语言都遵循一些通用规则。

什么是原始字符串字面量?

字面量是在程序运行期间其值保持不变的变量。而原始字符串字面量是一种不处理 C++ 转义字符(如 '\n'、'\t' 或 '\"')的字符串。因此,原始字符串字面量以 R"( 开始,并以 )" 结束。

原始字符串字面量的语法

在这种情况下,分隔符是可选的,可以是除了反斜杠(/)、空白字符( )和括号(())之外的任何字符。

这些原始字符串字面量通过将其内容精确编码为原始字符序列来表示一系列字符。

示例

普通字符串字面量

原始字符串字面量与普通字符串字面量的区别如下:

普通字符串字面量原始字符串字面量
无需对其进行任何定义。它需要以 R 前缀开头,并用括号 () 括起一个已定义的行。
它排除/不允许嵌套字符。它允许/包含嵌套字符的实现。
它包含了每个字符的独特属性,而不会忽略它们的特定含义。它将所有特殊字符(如 \n 和 \t)视为常规文本,并忽略它们的特殊含义。

原始字符串字面量示例

字符串字面量中的配对分隔符是什么?

多种语言允许使用配对分隔符,即开始和结束分隔符是不同的。此外,由于它们通常允许嵌套字符串,只要分隔符是成对的,就可以插入分隔符,但插入一个未配对的结束分隔符仍会导致分隔符冲突。例如 m4,它使用撇号 (') 作为结束分隔符;以及 PostScript,它使用括号,如 (The swift (brown fox))。Tcl 支持引号(用于插值字符串)和花括号(用于原始字符串),如 "The quick brown fox" 或 {The quick brown fox}。这是因为在 Tcl 中,代码块在语法上等同于字符串字面量,而分隔符的配对特性对于实现这一点至关重要。

Unicode 字符集中提供了配对(即不同的开始和结束)版本的单引号和双引号。

字符串字面量中的分隔符冲突是什么?

当使用引号时,如果你想在字符串字面量中表示分隔符本身,就会出现分隔符冲突问题。例如,如果双引号作为分隔符,你不能简单地通过字面量来表示双引号。你不能写 "" 或 "This is "in quotes", but invalid.",因为第二个引号被解释为字符串字面量的结尾,而不是字符串的值,而中间的引号被解释为在引号之外。有几种选择,其中最通用的是使用转义序列,如 "\"" 或 "This is \"in quotes\" and properly escaped",但还有其他一些选择。

配对引号(例如 Tcl 中的花括号)并不能解决分隔符冲突问题,因为无法简单地添加一个不平衡的结束分隔符,例如 {}}。然而,配对引号确实允许嵌套字符串,例如 {foo {bar} zork}。

转义序列

转义序列历史悠久,是一种通用的方法,用于表示那些难以直接表示的字符,例如分隔符、非打印字符(如退格符)、换行符和空白字符(否则在视觉上无法区分)。因此,它们经常在字符串字面量中使用。向单个字符或整个字符串添加转义序列的过程称为“转义”。