You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用两个预处理宏分别开启和结束原始字面量字符串?

解决C++原始字符串宏展开失败问题

你写的这段代码无法正常编译,原因是预处理器遇到BEGIN_RAW定义里的R"(后,会立刻开始寻找匹配的)",但此时END_RAW还没被展开,预处理器找不到闭合序列,直接报错。

要实现用宏定义原始字符串的起始和结束标记,你可以给原始字符串添加自定义分隔符,让预处理器能正确识别完整的原始字符串边界:

#define BEGIN_RAW R"RAW(
#define END_RAW )RAW"

const char* foo =
BEGIN_RAW
    this is a
    raw string
END_RAW;

这段代码展开后会变成合法的原始字符串字面量:

const char* foo =
R"RAW(
    this is a
    raw string
)RAW";

自定义分隔符(这里用的是RAW)可以换成任意不含括号和反斜杠的字符序列,只要起始和结束的分隔符完全一致就行。

如果不想用自定义分隔符,也可以通过间接宏展开的方式,让预处理器先处理宏再解析原始字符串:

#define _RAW_START R"(
#define _RAW_END )"
#define BEGIN_RAW _RAW_START
#define END_RAW _RAW_END

const char* foo =
BEGIN_RAW
    this is a
    raw string
END_RAW;

不过这种方式依赖编译器的预处理器处理顺序,不如加自定义分隔符的方法稳定可靠。

内容的提问来源于stack exchange,提问作者terriblememory

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:53:13