网站注册信息查询,建网站多少钱建个网站需要怎么做,做网站需要几个程序,wordpress文章显示软件下载使用openMVS库#xff0c;在VS2022中启用c17标准编译仍然报错
现象
项目中引用了某些开源库#xff08;例如openmvs2.1.0#xff09;#xff0c;编译时要求启用编译器对c17的支持。
没问题#xff01;大家都知道在下图所示的位置调整C语言标准#xff1a; 但是#…使用openMVS库在VS2022中启用c17标准编译仍然报错
现象
项目中引用了某些开源库例如openmvs2.1.0编译时要求启用编译器对c17的支持。
没问题大家都知道在下图所示的位置调整C语言标准 但是打开开关之后编译依然报错 这可真是一个令人百思不得其解的错误啊。报错的文件是官方的头文件type_traits双击之后跳转的错误位置也看不出个所以然。 这下头大了。不过之前编译openmvs库时用的是同一版本的VS编译器怎么就成功了呢于是查看vcpkg自动编译openmvs时用cmake配置生成的CMakeCache.txt中的编译选项才找到了真正原因如下图所示 图中标出来的选项是cmake生成的并不常见至少在VS2022中没有提供开关而只能靠用户手动输入到属性页、C/C、命令行的其他选项框中。
报错原因__cplusplus宏
__cplusplus宏是MSVC编译器预定义的宏它的值是许多语法特性的开关。前面讲了要启用c17标准就在C语言标准设置好即可。然而__cplusplus宏值不随上面的C语言标准/std 选项设置而改变需要同时添加/Zc:__cplusplus编译选项才能随着语言标准而改变如下表所示
/Zc:__cplusplus 选项/std 选项__cplusplus 值Zc:__cplusplus/std:c14默认值201402LZc:__cplusplus/std:c17201703LZc:__cplusplus/std:c20202002LZc:__cplusplus/std:clatest当前最新日期目前是202002LZc:__cplusplus-已禁用任何值199711L未指定任何值199711L
表中的/std 选项就是上一节的C语言标准属性。 可见如果没有添加/Zc:__cplusplus__cplusplus宏的值始终都是199711L启用的c17标准也是不完整的。微软这么操作的理由是有很多老代码写得不规范不符合语言标准之前版本的编译器由于对语言标准的遵守不严格能编译通过我们希望使用新编译器时它们的改动也尽可能小。 于是本来支持严格的标准C语法的编译器的默认状态仍和原来一样__cplusplus宏的值始终是199711L直到开发者在编译器的命令行中加入/Zc:__cplusplus它才真正变成实际使用语言标准的值。
其实多数情况下__cplusplus宏的值对代码编译影响不大。但是很多高水平开源库使用了新语法恰恰需要__cplusplus宏的值符合语言标准/std 选项才能编译通过这是对开源开发者很不友好的。 P.S. 官方的愿景是有朝一日仅需要设定/std 选项__cplusplus宏的值就随之改变不需要额外添加/Zc:__cplusplus。 解决方法
在属性页—C/C—命令行—其他选项中添加/Zc:__cplusplus。重新编译即可。 扩展阅读
/Zc-cplusplus的微软官方说明 C语言标准切换选项 官方终于能正确设定__cplusplus值了
用/std选项确定c/c语言标准 强制符合语法标准选项/permissive-
一点认识MSVC的C/C编译器默认情况下实现了当前标准和未来一些标准中的语法。当指定语言标准为默认的/std:c14时大部分新标准的语法将被禁用但仍有一部分在引入/std选项之前就实现的新语法标准可用。 但指定/std:cxx(xx14)时新实现的cxx以后的语法将不可用。