问题
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:
#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?
回答1:
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 all warnings. For example, some linker warnings are impossible to turn off.
回答2:
#pragma warning(disable:4820)
#pragma warning(disable:4619)
#pragma warning(disable:4668)
for less lines....
#pragma warning (disable : 4820 4619 4668)
回答3:
What I've done before is set the "W3" option rather than "Wall" then in each of my own source .cpp files I put
#pragma warning(push, 4)
at the top AFTER all the "#include..." lines and then
#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:
Using the technique described in the Assaf Lavie's answer it is possible to create helper macros:
#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
来源:https://stackoverflow.com/questions/525677/is-there-a-way-to-disable-all-warnings-with-a-pragma