关注公众号获取更多信息:
字符串字面量可能经常会在工作中用到,特别是写UT的时候。
想象一下如下场景:
一个程序,我们想要输入如下的内容:
std::string normal_str = "First line.\nSecond line.\nEnd of message.\n";
为何换行,我们必须要用\n再表示,同时考虑下边的场景:
我们要打印如下内容:
this is "test"
我们不得不用如下的代码,对" 进行转义:
std::string normal_str = "this is \"test\"";
我就想输出一个“纯粹”的字符,不得不用一些特殊的字符串来实现。这不科学。
C++11引入了字符串字面量的概念。对于前面的例子,我们就可以通过如下的方式实现我们的目的:
std::string normal_str = R"(First line.
Second line.
End of message.
)"
std::string normal_str = R"(this is "test")";
是不是很方便?特别是在有很多需要转义的场景,比如html定义,http message等场景。
日常的使用看到这就足够了,如果有更高的兴趣请继续看。还有就是C++11支持用户自定义字面量。如果感兴趣可以自行百度。如果大家对这个感兴趣,可以写一期用户自定义字面量的文章。
其实上边的描述只是字符串字面量的一种用法,官方还有如下用法:
解释
串字符系列 | - | 零或更多个 串字符 的序列。串字符 是下列之一
|
前缀 | - | L 、u8 、u 、U 之一 |
分隔符 | - | 除了括号、反斜杠和空格以外的任何源字符所构成的字符序列(可为空,长度至多 16 个字符) |
原始字符 | - | 任何字符序列,但必须不含闭序列 ) 分隔符" |
1) 窄多字节字符串字面量。无前缀字符串字面量的类型是 const char[N],其中 N
是以执行窄编码的编码单元计的字符串的大小,包含空终止符。
2) 宽字符串字面量。L"..." 字符串字面量的类型是 const wchar_t[N],其中 N
是以执行宽编码的编码单元计的字符串的大小,包含空终止符。
3) UTF-8 编码的字符串字面量。u8"..." 字符串字面量的类型是 const char[N] (C++20 前)const char8_t[N] (C++20 起),其中 N
是以 UTF-8 编码单元计的字符串的大小,包含空终止符。
4) UTF-16 编码的字符串字面量。u"..." 字符串字面量的类型是 const char16_t[N],其中 N
是以 UTF-16 编码单元计的字符串的大小,包含空终止符。
5) UTF-32 编码的字符串字面量。U"..." 字符串字面量的类型是 const char32_t[N],其中 N
是以 UTF-32 编码单元计的字符串的大小,包含空终止符。
6) 原始字符串字面量。用于避免转义任何字符。分隔符间的任何内容都成为字符串的一部分。若存在 前缀 则具有与上述相同的含义。
官方的例子:
#include <iostream>
char array1[] = "Foo" "bar";
// 同
char array2[] = { 'F', 'o', 'o', 'b', 'a', 'r', '\0' };
const char* s1 = R"foo(
Hello
World
)foo";
// 同
const char* s2 = "\nHello\n World\n";
// 同
const char* s3 = "\n"
"Hello\n"
" World\n";
int main()
{
std::cout << array1 << '\n';
std::cout << array2 << '\n';
std::cout << s1 << s2 << s3;
}
每个 串字符 初始化字符串字面量对象中的对应元素。一个 串字符 对应多于一个元素当且仅当它由字符串字面量的关联字符编码中多于一个编码单元的序列表示。
若字符缺少在关联字符编码中的表示,
| (C++23 起) |
每个数值转义序列对应单个元素。若转义序列所指定的值适合元素类型的无符号版本,则元素拥有(可能在转换到元素类型后的)指定值;否则(指定值在范围外)字符串字面量非良构。(C++23 起)