系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、问题定位
- 二、问题解决
- 3 /permissive-选项作用
前言
使用visual studio2019打开Qt工程,release编译和运行都正常,但是切换到debug无法编译通过,visual studio2019报错如下:主要有2类错误
错误 C2338 On MSVC you must pass the /permissive- option to the compiler.
错误 C2139 “QString”: 未定义的类不允许作为编译器内部类型特征“__is_convertible_to”的参数
一、问题定位
既然release编译和运行都正常,说明代码应该是没有问题的,关键点想必在visual studio2019项目设置上。
二、问题解决
项目鼠标右键,选择C/C+±>命令行->其他选项,添加:/permissive-
注意:permissive后面有个"-",横杠
3 /permissive-选项作用
按照微软官方的说法 说实话没看懂,请各位大佬有懂得的,指点小弟一下,不胜感激。
指定编译器的标准符合性模式。 使用此选项可帮助你识别并修复代码中的符合性问题,使其更正确且更易移植。
语法
/permissive-
/permissive
备注
Visual Studio 2017 及更高版本支持 /permissive- 选项。 Visual Studio 2019 版本 16.8 及更高版本支持 /permissive。
可以使用 /permissive- 编译器选项来指定符合标准的编译器行为。 此选项禁用宽松行为,并设置 /Zc 编译器选项以执行严格的符合性。 在 IDE 中,此选项还使 IntelliSense 引擎用下划线标出不符合标准的代码。
/permissive- 选项使用当前编译器版本中的符合性支持来确定哪些语言构造不符合要求。 此选项不能确定代码是否符合特定版本的 C++ 标准。 若要为最新的草稿标准启用所有实现的编译器支持,请使用 /std:c++latest 选项。 若要将编译器支持限制为当前实现的 C++20 标准,请使用 /std:c++20 选项。 若要将编译器支持限制为当前实现的 C++17 标准,请使用 /std:c++17 选项。 若要将编译器支持限制为以更接近 C++14 标准,请使用 /std:c++14 选项(这是默认选项)。
从 Visual Studio 2019 版本 16.8 开始,/permissive- 选项由 /std:c++latest 选项隐式设置,在版本 16.11 中,由 /std:c++20 选项隐式设置。 若要支持 C++20 模块,/permissive- 是必需的。 也许你的代码不需要模块支持,但需要在 /std:c++20 或 /std:c++latest 下启用其他功能。 可以使用不带尾部斜杠的 /permissive 选项显式启用 Microsoft 扩展支持。 /permissive 选项必须位于隐式设置 /permissive- 的任何选项之后。
默认情况下,在 Visual Studio 2017 版本 15.5 及更高版本创建的新项目中设置 /permissive- 选项。 在早期版本中,默认不设置它。 设置选项后,编译器会在代码中检测到非标准语言构造时生成诊断错误或警告。 这些构造包括 C++11 之前的代码中的一些常见 bug。
从 Windows Fall Creators SDK (10.0.16299.0) 开始,/permissive- 选项与最新 Windows 工具包(例如软件开发工具包 (SDK) 或 Windows 驱动程序工具包 (WDK))中几乎所有的头文件兼容。 由于各种源代码符合性原因,旧版 SDK 可能无法在 /permissive- 下进行编译。 编译器和 SDK 的发布时间不同,因此存在一些遗留问题。 有关具体的头文件问题,请参阅下面的 Windows 标头问题。
/permissive- 选项将 /Zc:referenceBinding、/Zc:strictStrings 和 /Zc:rvalueCast 选项设置为符合行为。 这些选项默认是不符合标准的行为。 可以在命令行上将特定的 /Zc 选项传递到 /permissive- 之后以替代此行为。
在从 Visual Studio 2017 版本 15.3 开始的编译器版本中,/permissive- 选项设置了 /Zc:ternary 选项。 编译器还实现了更多关于两阶段名称查找的要求。 设置 /permissive- 选项后,编译器将分析函数和类模板定义,并标识模板中使用的依赖名称和非依赖名称。 在此版本中,仅执行名称依赖项分析。
自 Visual Studio 2022 Update 17.6 起,/permissive- 选项设置 /Zc:lambda 和 /Zc:externConstexpr 选项。 在以前的版本中,/permissive- 未设置任何一个。
特定于环境的扩展和语言区域(标准由实现确定)不受 /permissive- 影响。 /permissive- 模式下的编译器不会标记特定于 Microsoft 的 __declspec、调用约定和结构化异常处理关键字,以及特定于编译器的 pragma 指令或属性。
早期版本的 Visual Studio 2017 中的 MSVC 编译器不支持所有符合 C++11、C++14 或 C++17 标准的代码。 根据 Visual Studio 的版本,/permissive- 选项可能不会检测到两阶段名称查找的某些方面的问题,例如将非常量引用绑定到临时、将复制初始化视为直接初始化、允许初始化中的多个用户定义的转换,或者逻辑运算符的替代令牌和其他不支持的符合性区域。 有关 Visual C++ 中一致性问题的详细信息,请参阅 Nonstandard Behavior。 为了充分利用 /permissive-,请将 Visual Studio 更新到最新版本。
如何修复代码
下面是在使用 /permissive- 时检测为不符合标准的代码的一些示例,以及对于修复问题的建议方法。