C++字符串符号_字面量前缀、转义序列与原始字符串语法

浅磊同学_8272

浅磊同学_8272

2026-03-24

797人浏览

原创

应按用途选前缀:u8用于utf-8跨平台文本,l用于windows宽字符api,u/u用于unicode库,无前缀依赖编译器编码,r用于免转义多行内容;混用前缀会导致拼接失败或运行时错误。

c++字符串符号_字面量前缀、转义序列与原始字符串语法

字符串字面量前缀 R、L、u8、u、U 怎么选

选错前缀会导致编码不匹配、宽窄字符混用、甚至编译失败。比如用 u8"中文" 写 UTF-8 字符串没问题,但用 "中文"(普通窄字符串)在 Windows 控制台默认 ANSI 编码下可能显示乱码;而 L"中文" 在 Windows 上是 UTF-16,但传给 printf 会崩溃——因为 printf 不接受 wchar_t*。

  • u8:明确声明 UTF-8 编码的窄字符串,推荐用于跨平台文本处理,如 JSON、HTTP header、文件路径(Linux/macOS)
  • L:生成 wchar_t 字符串,Windows API(如 CreateFileW)必须用它;但 Linux 的 wchar_t 是 32 位,与 Windows 的 16 位不兼容,跨平台慎用
  • u 和 U:分别生成 char16_t* 和 char32_t*,主要用于 Unicode 处理库(如 ICU),日常开发极少直接使用
  • 没前缀的 "..." 是 const char*,编码依赖源文件保存格式和编译器设置(GCC/Clang 默认 UTF-8,MSVC 默认系统 ANSI)

R"(...)" 原始字符串里为什么还能写 却不换行

原始字符串根本不解析任何转义序列—— 就是字面上的反斜杠加 n,两个独立字符。你看到的换行,其实是字符串字面量里真的敲了回车键。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 原始字符串的边界由自定义分隔符决定:R"delimiter(实际内容)delimiter",括号内所有内容(包括空格、缩进、真实换行)都原样保留
  • 想在原始字符串里包含 ) 或 ",只要确保它们不出现在分隔符序列中即可,比如 R"xyz(Hello "World")xyz" 是合法的
  • 常见误用:把 R"(line1 line2)" 当作带换行的字符串——其实它存的是 l i n e 1 n l i n e 2 六个字符,不是两行
  • 适合场景:正则表达式(避免四层反斜杠)、SQL 片段、多行 HTML 模板

混合使用 R"..." 和普通字符串字面量会出什么问题

编译器允许相邻字符串字面量自动拼接,但前提是类型一致。一旦混用前缀,拼接就失败。

  • "hello" "world" → OK,都是窄字符串
  • u8"hello" "world" → OK,u8 前缀可隐式传播
  • R"(hello)" "world" → 编译错误:error: invalid operands to binary expression ('const char*' and 'const char*'),因为 R"..." 是 const char*,但拼接规则不适用于原始字符串和其他类型混搭
  • 安全做法:全用同一种前缀,或显式用 std::string 拼接,比如 std::string(R"(a)") + "b"

转义序列在非原始字符串里哪些能用、哪些会踩坑

标准转义序列只有 、 、"、\ 等十几个是可靠跨平台的;其他像 (垂直制表)、(响铃)行为不一致, 后面紧跟数字容易被误解析为八进制。

  • x 十六进制转义只认紧随其后的有效十六进制字符,"ÿG" 中的 G 不属于转义,是独立字符
  • 结尾是 C 风格字符串的终止标志,但 "abcdef" 实际只取到 abc,后面 def 被截断——除非你用 std::string_view 显式指定长度
  • UTF-8 字符的转义必须用字节序列,不能用 Unicode 码点:正确是 u8"中文",错误是 "u4F60"(那是 UTF-16 编码,且仅在宽字符串中合法)
  • Windows 路径分隔符反斜杠要双写:"C:\Users\name",否则 U 可能被误认为 Unicode 转义(即使实际不是)
事情说清了就结束。最常被忽略的是:原始字符串的换行是物理换行,不是 ;以及拼接字符串时前缀不一致比内容错误更早触发编译失败。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4043

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

851

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1049

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5921

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2823

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5900

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7861

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1070

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

932

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习