C++中多行字符串有四种写法:①字面量自动拼接(轻量安全,无换行符);②括号包裹字面量(更健壮易读);③原始字符串(保留换行与特殊字符);④运行时拼接(支持变量插入)。
在 C++ 中,相邻的字符串字面量会由编译器自动连接成一个字符串,这是最轻量、最安全的多行写法,不需要任何运行时开销。
常见错误是误以为换行符会被保留——实际不会,除非你显式写 \n;另外,中间不能有空行或注释,否则编译失败。
"SELECT id, name, email FROM users " "WHERE status = 'active' " "AND created_at > '2025-01-01';"
相比老式 \ 续行(易因空格或注释失效),用圆括号把多行字符串字面量包起来更健壮。编译器仍按自动拼接规则处理,但语法上更清晰。
容易踩的坑:括号内不能混用变量或表达式,否则报错 expected primary-expression before '...' token;它只适用于纯字面量。
( "Usage: app --input" "--output " "--verbose" )
当字符串里含大量 \n、"、\t 或 Windows 路径(如 C:\temp\log.txt),用原始字符串可彻底避免转义混乱。
关键点:定界符(如 R"xxx(...) 中的 xxx)必须唯一,不能在内容中出现相同序列;否则编译

R"(...)"),但若内容含 )" 就必须加自定义前缀R"(...)R"(...)" 是非法的),如需拼接得用 + 或 std::string
R"(SELECT * FROM products WHERE price > 100 ORDER BY name;)"
需要插入变量、条件分支或循环生成内容时,必须用运行时拼接。直接用 + 最直观,但频繁拼接小字符串可能触发多次内存重分配;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 引号或反斜杠——那部分必须手动处理。