C++11新特性(一)——原始字面量

目录

[1. 原始字面量的使用](#1. 原始字面量的使用)

[2. 注意事项](#2. 注意事项)


1. 原始字面量的使用

在C++11 中添加了定义原始字符串的字面量,定义方式为 R "xxx(原始字符串)xxx",其中()两边的字符串可以省略。原始字面量R可以直接表示字符串的实际含义,不需要额外的转义字符进行转义

例如,当我们要打印一个路径时,由于路径字符串中常常包含一些特殊字符,传统方法通常需要使用转义字符 '\' 来处理。但如果使用原始字符串字面量,就可以轻松解决这个问题。

cpp 复制代码
int main(int argc, char const *argv[])
{
    string str = "D:\hello\world\test.text";
    cout << "str: " << str << endl;
    string str1 = "D:\\hello\\world\\test.text";
    cout << "str1: " << str1 << endl;
    string str2 = R"(D:\hello\world\test.text)";
    cout << "str2: " << str2 << endl;
    return 0;
}

输出结果

cpp 复制代码
D:helloworld    est.text
D:\hello\world\test.text
D:\hello\world\test.text
  • 第一条语句中,\h 和 \w 转义失败,对应地字符串会原样输出
  • 第二条语句中,第一个反斜杠是对第二个反斜杠的转义,最终才能得到一个没有特殊含义的普通字符 \
  • 第三条语句中,使用了原始字面量 R() 中的内容来描述路径的原始字符串,因此无需做任何处理

在 C++11 之前如果一个字符串分别写到了不同行里,需要加连接符,这种方式不仅繁琐,还破坏了表达式的原始含义,如果使用原始字面量就变得简单很多,很强直观,可读性强。我们通过一个输出 HTML 标签的例子体会一下原始字面量。

cpp 复制代码
int main(int argc, char const *argv[])
{
    string str = R"(<html>
                    <head>
                        <title>
                            海贼王
                        </title>
                    </head>
                    <body>
                        <p>
                            我是要成为海贼王的男人!!!
                        </p>
                    </body>
                 </html>)";
    cout <<  str << endl;
    return 0;
}

输出结果

cpp 复制代码
str: <html>
        <head>
            <title>
                海贼王
            </title>
        </head>
        <body>
            <p>
                我是要成为海贼王的男人!!!
            </p>
        </body>
    </html>

2. 注意事项

最后强调一个细节:在 R "xxx()xxx" 中,原始字符串必须用括号()括起来,括号的前后可以加其他字符串,所加的字符串会被忽略,并且加的字符串必须在括号两边同时出现(两边出现的字符串长度、顺序都要一模一样)。因此,为了方便,我们在实际使用中通常不会在 () 两侧加字符串。

cpp 复制代码
std::string s4 = R"123(abc\def)123"; // 成功输出 abc\def
std::string s5 = R"123(abc)456";     // 报错,左侧"123"和右侧"456",不匹配
相关推荐
Lhan.zzZ7 小时前
笔记_2026.4.28_004
c++·ide·笔记·qt
MATLAB代码顾问8 小时前
5大智能算法优化标准测试函数对比(Python实现)
开发语言·python
wuminyu9 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
万粉变现经纪人9 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒9 小时前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼10 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
木喃的井盖10 小时前
无锁队列细节
c++·工程
王老师青少年编程10 小时前
csp信奥赛C++高频考点专项训练之字符串 --【字符串基础】:输出亲朋字符串
c++·字符串·csp·高频考点·信奥赛·专项训练·输出亲朋字符串
WBluuue10 小时前
数据结构与算法:莫队(一):普通莫队与带修莫队
c++·算法
小郑加油11 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习