能否用两个预处理宏分别开启和结束原始字面量字符串?
解决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
相关产品推荐
相关产品推荐

