当 Visual Studio 2017 与 std 标头不兼容时,如何使用最高警告级别(墙)?

Posted

技术标签:

【中文标题】当 Visual Studio 2017 与 std 标头不兼容时,如何使用最高警告级别(墙)?【英文标题】:How to use The highest Warning Level (Wall) for Visual Studio 2017 when it's incompatible for the std headers? 【发布时间】:2017-08-08 22:50:50 【问题描述】:

但我想将它与“警告视为错误”一起使用 = 是

编译器标志中似乎有很多有用的检查,但它与标准头文件不兼容。我想使用这个编译器标志来检查我的代码,而不是 std 头文件。有没有办法做到这一点?

或者只是禁用我没有编写的任何代码的警告?

编辑:

添加了 Visual Studio 中的设置图片以及我尝试构建时发生的情况的示例。只包含 iostream!

Example when trying to compile a basic C++ program with these settings

【问题讨论】:

我认为不是。但是IMO的错误警告太过分了。如果你不忽略它们就足够了 “它与标准头文件不兼容”——在什么意义上?举个例子。 我添加了一张图片来显示当您包含 并尝试编译 C++ 程序时会发生什么。 是的,我绝对可以确认,当打开最高警告级别 (/Wall) 时,您将完全被来自 MSVC 中分布的 STD 标头的警告所淹没(这很遗憾)。由于我也喜欢使用“警告作为错误”,我通常使用“/W4 /WX”并进一步禁用一些额外的警告(例如,模板中经常出现的 C4503)。现在的情况实际上比过去好一些,MSVC 6.0 中的 STL 即使使用 /W4 也不能很好地发挥作用,不得不改用 /W3。 @axalis 我可以对我没有编写的任何代码禁用警告吗? 【参考方案1】:

您可以通过在每次包含之前更改警告级别来禁用标题中的警告(或更改警告级别),请参见此处:How to suppress warnings in external headers in Visual C++。然而,这不是那么方便,因为需要为每个包含都完成它。

但是,如果您使用precompiled headers(这实际上可能对编译速度有好处),您可以将您关心的所有系统/STL 头文件放入预编译的头文件中,然后通过编译指示禁用它们。或者您需要为标准标头创建包装器,您将在其中禁用警告并包含包装器标头。

正如所讨论的,“/Wall”有时会走得太远(例如,填充是很常见的事情,您有时甚至无法做任何事情),即使使用“/W4”,documentation 也会提到它可能太详细了(不过同时推荐给新项目,所以我一般在新项目中使用“/W4 /WX”)。然而,一些“/Wall”警告仍然可能会发现一些细微的错误(比如 switch 中缺少大小写等)。您不妨只启用some of the extra warnings selectively。

【讨论】:

以上是关于当 Visual Studio 2017 与 std 标头不兼容时,如何使用最高警告级别(墙)?的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2015 中打开 Visual Studio 2017 项目

visual studio2017怎么使用strcat,strcpy,strlwr,strupr

Visual Studio 2017的安装与使用

Visual Studio 2019 中的 .Net Core 项目缺少“初始化与项目的交互”

Visual Studio 2017 在保存时意外关闭文件

如何将 LocalDB 2016 与 Visual Studio 2017 一起安装?