C++ 有没有办法用编译指示禁用所有警告?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/525677/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 15:47:53  来源:igfitidea点击:

Is there a way to disable all warnings with a pragma?

c++visual-c++pragma

提问by Ferruccio

I've started a new project and have decided to make sure it builds cleanly with the /Wall option enabled. The only problem is not all 3rd party libraries (like boost) compile without warnings, so I've resorted to doing this in a shared header:

我开始了一个新项目,并决定确保它在启用 /Wall 选项的情况下干净利落地构建。唯一的问题是并非所有 3rd 方库(如 boost)都可以在没有警告的情况下编译,所以我在共享头文件中执行此操作:

#pragma warning(push)

#pragma warning(disable:4820)
#pragma warning(disable:4619)
#pragma warning(disable:4668)
#pragma warning(disable:4625)
#pragma warning(disable:4626)
#pragma warning(disable:4571)
#pragma warning(disable:4347)
#pragma warning(disable:4640)
#pragma warning(disable:4365)
#pragma warning(disable:4710)
#pragma warning(disable:4820)
#pragma warning(disable:4350)
#pragma warning(disable:4686)
#pragma warning(disable:4711)
#pragma warning(disable:4548)

#include <boost/array.hpp>
#include <boost/assert.hpp>
#include <boost/assign.hpp>
#include <boost/bind.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp>
#include <boost/format.hpp>
#include <boost/function.hpp>
#include <boost/integer.hpp>
#include <boost/optional.hpp>
#include <boost/regex.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/utility.hpp>
#include <boost/variant.hpp>

#pragma warning(pop)

This works well enough, but every time I add new boost headers I have to add whatever warnings they generate to the list. Is there a way to say disable all warnings for this stretch of code?

这工作得很好,但每次我添加新的 boost 标头时,我都必须将它们生成的任何警告添加到列表中。有没有办法说禁用这段代码的所有警告?

回答by Assaf Lavie

You can push/pop a low level of warning, like this:

您可以推送/弹出低级别警告,如下所示:

#pragma warning(push, 0)        

#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
// ...

#pragma warning(pop)

But know that it's not possible to disable allwarnings. For example, some linker warnings are impossible to turn off.

但要知道不可能禁用所有警告。例如,某些链接器警告无法关闭。

回答by EvilTeach

#pragma warning(disable:4820)
#pragma warning(disable:4619)
#pragma warning(disable:4668)

for less lines....

对于更少的线路....

#pragma warning (disable : 4820 4619 4668)

回答by Matt Warren

What I've done before is set the "W3" option rather than "Wall" then in each of my own source .cpp files I put

我之前所做的是设置“W3”选项而不是“Wall”,然后在我放置的每个源 .cpp 文件中

#pragma warning(push, 4)

at the top AFTER all the "#include..." lines and then

在所有“#include ...”行之后的顶部,然后

#pragma warning(pop)

as the very last line of the file.

作为文件的最后一行。

This way you get level 4 warnings in your code and level 3 in 3rd party code that you can't do anything about.

通过这种方式,您会在代码中获得 4 级警告,在 3rd 方代码中获得 3 级警告,您对此无能为力。

回答by PolarBear

Using the technique described in the Assaf Lavie's answerit is possible to create helper macros:

使用Assaf Lavie 的回答中描述的技术,可以创建辅助宏:

#define DISABLE_ALL_WARNINGS_BEGIN \
    __pragma(warning(push, 0))

#define DISABLE_ALL_WARNINGS_END \
    __pragma(warning(pop))

They can be used in the following way (online demo):

它们可以通过以下方式使用(在线演示):

DISABLE_ALL_WARNINGS_BEGIN
void foo(int a)
{
    // this function should generate the following warning
    // "warning C4100: 'a': unreferenced formal parameter"
    // unless it is not wrapped inside "DISABLE_ALL_WARNINGS" section
}
DISABLE_ALL_WARNINGS_END