C++原始字符串含R"()"引发解析混淆,如何正确转义?
解决C++原始字符串嵌套
R"()"的解析混淆问题 这个问题我写代码时也踩过坑!C++的原始字符串字面量默认用)作为结束标记,所以当字符串内容里刚好出现R"()"时,解析器会误把里面的)当成整个原始字符串的结束,直接导致编译报错。
其实解决方法特别简单——给原始字符串加一个自定义分隔符,就能完美避开这个冲突。
原始字符串的完整语法
你之前用的R"(内容)"是简化版,它的完整语法其实是:
R"delim(内容)delim"
这里的delim是可选的自定义分隔符(默认是空),只要满足这些规则就行:
- 最多包含16个字符
- 不能有空格、括号
()、反斜杠\ - 不能是单引号
'或双引号"
针对你的问题的具体写法
给你的例子加一个不会在内容里出现的分隔符,比如my_tag:
string raw_str = R"my_tag(R"(foo)")my_tag";
这下编译器就会把)my_tag当成整个原始字符串的结束标记,再也不会被内容里的)干扰了。
额外小提醒
如果你的字符串内容里刚好包含了你选的分隔符(比如内容里有)my_tag),那换一个不会冲突的分隔符就行,比如abc_123:
string tricky_str = R"abc_123(R"(foo)abc_123)")abc_123";
只要保证分隔符和内容里的字符串不重复,就不会再出现解析混淆的问题。
内容的提问来源于stack exchange,提问作者One Two Three
相关产品推荐
相关产品推荐

