有没有一种方法可以使用#pragma禁用所有警告?

45

我开始一个新项目,并决定使用启用/Wall选项来确保它能够干净的构建。唯一的问题是,不是所有第三方库(如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)

这个方法运行良好,但是每次我添加新的boost头文件时,我都必须将它们生成的任何警告添加到列表中。有没有一种方法可以禁用此代码段中的所有警告?

4个回答

63

你可以像这样推送/弹出低级警告:

#pragma warning(push, 0)        

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

#pragma warning(pop)

但是要知道,无法禁用所有警告。例如,一些链接器警告无法关闭。


我并不是要宣扬亡灵术,但在你的评论里我看到了一个推送/弹出警告的一对一关系。如果我禁用N个警告,那么我需要调用N次弹出吗?再次抱歉挖起这个老帖子。 - wheaties
3
你禁用的警告数量并不重要,重要的是“推”操作的次数必须与“弹出”操作的次数相匹配。 - Assaf Lavie
4
有趣的是,如果使用 #pragma warning (pop),仍然会发出某些警告(例如 4514),这可能是因为在某些后编译上下文中依然检测到了这些警告条件。 - alecov

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

为了减少代码行数...

#pragma warning (disable : 4820 4619 4668)

5
我之前所做的是将“W3”选项设为默认,而不是“Wall”,然后在每个自己的源.cpp文件中添加:
#pragma warning(push, 4)

在所有的“#include…”行之后放置在顶部,然后…
#pragma warning(pop)

作为文件的最后一行。
这样您就可以在您的代码中获得4级警告,在第三方代码中获得3级警告,而您无法对其进行任何处理。

4
似乎将你自己的每一个代码文件用#pragma warning指令包装起来比仅仅将有问题的第三方#include包装起来更费力。但如果这对你有效的话... - Christian Severin

5
使用Assaf Lavie's answer中描述的技术,可以创建辅助宏:
#define DISABLE_ALL_WARNINGS_BEGIN \
    __pragma(warning(push, 0))

#define DISABLE_ALL_WARNINGS_END \
    __pragma(warning(pop))

他们可以按以下方式使用(在线演示):
DISABLE_ALL_WARNINGS_BEGIN
void foo(int a)
{
    // this function should generate the following warning
    // "warning C4100: 'a': unreferenced formal parameter"
    // unless it is wrapped inside "DISABLE_ALL_WARNINGS" section
}
DISABLE_ALL_WARNINGS_END

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接