Visual Studio中#if 0屏蔽的原始字符串触发C1071错误是什么原因?
问题原因
这个错误是Visual Studio 2019 16.7及更早版本的传统MSVC预处理器的已知bug导致的,具体触发逻辑如下:
- 旧版MSVC预处理器在处理
#if 0包裹的禁用代码块时,不会正确识别C++11及以上标准引入的原始字符串字面量(R"()"格式)的边界 - 你代码的原始字符串内部存在
/*序列(来自路径通配符/mnt/*.txt),预处理器会错误把这个序列识别为C风格块注释的起始标记,之后持续寻找配对的*/结束标记直到文件末尾都没找到,因此抛出「注释中意外遇到文件结尾」的C1071错误
解决方案
可任选以下一种方式修复:
- 升级Visual Studio到16.8及以上版本,该版本开始默认启用符合C++标准的新预处理器,不会触发该bug
- 不升级版本的前提下,在项目属性的「C/C++→命令行」配置页添加编译选项
/Zc:preprocessor,手动启用新标准预处理器 - 临时规避可以将
#if 0块内原始字符串中的/*拆分为分开的字符,或者调整原始字符串内容避免出现/*序列
内容的提问来源于stack exchange,提问作者jtooker
相关产品推荐
相关产品推荐

