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",不匹配
相关推荐
Oxye20 小时前
服务器内存不足导致程序没完全起起来,报错Required type must not be null
java·开发语言
乾元20 小时前
自动化补丁评估与策略回滚:网络设备固件 / 配置的风险管理
运维·开发语言·网络·人工智能·架构·自动化
2501_9167665420 小时前
【Java】static关键字与类的加载顺序
java·开发语言
山峰哥20 小时前
SQL查询优化秘籍:从Explain分析到性能飞跃
开发语言·数据库·sql·oracle·性能优化·系统优化
世转神风-20 小时前
qt-通信协议基础-QStirng转QByteArray-与字节序互动
开发语言·qt
资生算法程序员_畅想家_剑魔20 小时前
Java常见技术分享-14-多线程安全-锁机制-常见的锁以及底层实现-synchronized
java·开发语言
江沉晚呤时20 小时前
构建智能代理的利器:深入解析 Microsoft Agent Framework
开发语言·c#
走粥20 小时前
JavaScript Promise
开发语言·前端·javascript
范纹杉想快点毕业20 小时前
C语言设计模式:从基础架构到高级并发系统(完整实现版)
c语言·开发语言·设计模式
先做个垃圾出来………20 小时前
Python测试桩工具
java·开发语言·python