目录
一.简介
1.基本概念
在传统的 C++ 字符串字面量中,反斜杠 \
被用作转义字符,用于表示一些特殊字符,如换行符 \n
、制表符 \t
等。但当字符串中本身包含大量反斜杠或引号时,需要对这些字符进行转义,这会使字符串的书写变得复杂且难以阅读。原始字面量的出现就是为了解决这个问题,它允许你直接书写字符串,而无需对特殊字符进行转义。
2.语法
R"delimiter(原始字符串内容)delimiter"
R
:这是原始字面量的标识符,用于告诉编译器这是一个原始字符串字面量。
delimiter
:这是一个可选的定界符,由最多 16 个基本字符(字母、数字、标点符号等)组成,用于标记原始字符串的开始和结束。定界符在开始和结束处必须保持一致。如果不指定定界符,默认使用空定界符。
(原始字符串内容)
:这是实际的字符串内容,其中可以包含任意字符,包括反斜杠和引号,无需进行转义。
二.示例代码
示例 1:简单的原始字面量
#include <iostream>
#include <string>
int main() {
// 传统字符串字面量,需要对反斜杠和引号进行转义
std::string traditional = "Hello, \"World!\"\\n";
// 原始字符串字面量,无需转义
std::string raw = R"(Hello, "World!"\n)";
std::cout << "Traditional: " << traditional << std::endl;
std::cout << "Raw: " << raw << std::endl;
return 0;
}
在这个示例中,传统字符串字面量 traditional
需要对引号和反斜杠进行转义,而原始字符串字面量 raw
可以直接书写,无需转义。
运行结果:
Traditional: Hello, "World!"\n
Raw: Hello, "World!"\n
示例 2:使用定界符
使用定界符原因:
在原始字符串字面量的基本语法 R"(原始字符串内容)"
里,字符串内容是用 (
和 )
括起来的。当字符串内容本身包含 )
时,如果没有定界符,编译器就无法准确判断字符串的结束位置。这时就需要使用定界符来避免这种混淆。
#include <iostream>
#include <string>
int main() {
// 使用定界符 "abc"
std::string rawWithDelimiter = R"abc(This is a "raw" string with delimiter (abc).)abc";
std::cout << "Raw with delimiter: " << rawWithDelimiter << std::endl;
return 0;
}
当字符串内容中包含 )
时,可以使用定界符来避免混淆。
运行结果:
Raw with delimiter: This is a "raw" string with delimiter (abc).
示例 3:多行原始字面量
#include <iostream>
#include <string>
int main() {
std::string multiLineRaw = R"(
This is a multi-line
raw string.
It can contain "quotes"
and \ backslashes without escaping.
)";
std::cout << "Multi-line raw string:" << std::endl;
std::cout << multiLineRaw << std::endl;
return 0;
}
在这个示例中,原始字面量可以直接包含换行符,无需使用 \n
进行转义。
通过使用原始字面量,可以使包含特殊字符的字符串的书写更加简洁和易读。
运行结果:
Multi-line raw string:
This is a multi-line
raw string.
It can contain "quotes"
and \ backslashes without escaping.