C++中多行字符串有四种写法:①字面量自动拼接(轻量安全,无换行符);②括号包裹字面量(更健壮易读);③原始字符串(保留换行与特殊字符);④运行时拼接(支持变量插入)。

用字符串字面量自动拼接多行
在 C++ 中,相邻的字符串字面量会由编译器自动连接成一个字符串,这是最轻量、最安全的多行写法,不需要任何运行时开销。
常见错误是误以为换行符会被保留——实际不会,除非你显式写 \n;另外,中间不能有空行或注释,否则编译失败。
- 必须用双引号包裹每段,且之间不能有逗号、分号或任何符号
- 支持 C++11 及以上,所有主流编译器(GCC/Clang/MSVC)都兼容
- 适合静态配置、SQL 查询、正则表达式等不需运行时拼接的场景
"SELECT id, name, email FROM users " "WHERE status = 'active' " "AND created_at > '2024-01-01';"
用括号包裹 + 换行避免行末反斜杠
相比老式 \ 续行(易因空格或注释失效),用圆括号把多行字符串字面量包起来更健壮。编译器仍按自动拼接规则处理,但语法上更清晰。
容易踩的坑:括号内不能混用变量或表达式,否则报错 expected primary-expression before '...' token;它只适用于纯字面量。
立即学习“C++免费学习笔记(深入)”;
- 括号必须紧贴字符串,不能在左括号前加空格或换行
- 每行字符串末尾的空格会被保留,注意缩进污染内容
- 比裸拼接更易读,尤其当某行过长需折行时
( "Usage: app --input" "--output " "--verbose" )
用原始字符串字面量(raw string)保留换行和特殊字符
当字符串里含大量 \n、"、\t 或 Windows 路径(如 C:\temp\log.txt),用原始字符串可彻底避免转义混乱。
关键点:定界符(如 R"xxx(...) 中的 xxx)必须唯一,不能在内容中出现相同序列;否则编译失败。
- 定界符可以为空(即
R"(...)"),但若内容含)"就必须加自定义前缀 - 原始字符串内换行符就是真实换行,输出时也会体现,适合模板、JSON 片段、正则模式
- 不支持字符串字面量拼接(
R"(...)R"(...)"是非法的),如需拼接得用+或std::string
R"(SELECT * FROM products WHERE price > 100 ORDER BY name;)"
运行时拼接:std::string + 运算符或 std::ostringstream
需要插入变量、条件分支或循环生成内容时,必须用运行时拼接。直接用 + 最直观,但频繁拼接小字符串可能触发多次内存重分配;std::ostringstream 更适合复杂格式化。
典型错误:对 const char* 直接用 +(如 "a" + "b")会报错,因为这是指针相加;必须至少一端是 std::string。
-
std::string s = std::string("hello") + " " + name + "!";—— 安全且可读 oss —— 避免临时对象,适合日志或协议组装- 若已知最终长度,可先调用
s.reserve(total_size)减少扩容次数
std::string path = std::string("C:\\Users\\") + username + "\\config.json";多行字符串的核心分歧不在“怎么写”,而在“要不要运行时参与”。字面量拼接零成本但死板,std::string 灵活但有开销。真正容易被忽略的是:混合使用时(比如 raw string + 变量),没人能帮你自动 escape 引号或反斜杠——那部分必须手动处理。











