Unfortunately, I don't think MSVC provides for a nice way to deal with this problem. I think you'll either need to continue explicitly turning warnings off/on when these headers are included (maybe using pragma macros to make it a bit easier as Praetorian suggested) or wrap the headers in your own headers that manage the warning level. The second option has the advantage of only needing to be done once. You can do this in a way that doesn't require you to modify each file that includes the original headers.
Say that HeaderGeneratingWarnings.h
is in the directory ExtLibDir
which your project/makefile is configured to add to the compiler's include search path. One thing you might consider doing is add a 'parallel' directory, ExtLibDirWrapper
and use that in the project/makefile configuration. Have it contain a set of headers that look something like:
ExtLibDir\HeaderGeneratingWarnings.h
:
#ifndef HEADERGENERATINGWARNINGS_WRAPPER
#define HEADERGENERATINGWARNINGS_WRAPPER
#if defined(_MSC_VER)
# pragma warning( push, 3 )
#endif
#include "../ExtLibDir/SomeExternalHeader.h"
#if defined(_MSC_VER)
# pragma warning( pop )
#endif
#endif /* HEADERGENERATINGWARNINGS_WRAPPER */
An initial set of pain, but a pretty mechanical process - a script could probably be quickly knocked out to take care of the whole thing. Hopefully it would take care of the problem from that point onward.
As an aside, GCC has a nice way to deal with this problem:
The header files declaring interfaces
to the operating system and runtime
libraries often cannot be written in
strictly conforming C. Therefore, GCC
gives code found in system headers
special treatment. All warnings, other
than those generated by `#warning'
(see Diagnostics), are suppressed
while GCC is processing a system
header. Macros defined in a system
header are immune to a few warnings
wherever they are expanded. This
immunity is granted on an ad-hoc
basis, when we find that a warning
generates lots of false positives
because of code in macros defined in
system headers.
Normally, only the headers found in
specific directories are considered
system headers. These directories are
determined when GCC is compiled. There
are, however, two ways to make normal
headers into system headers.
The -isystem command line option adds
its argument to the list of
directories to search for headers,
just like -I. Any headers found in
that directory will be considered
system headers.
All directories named by -isystem are
searched after all directories named
by -I, no matter what their order was
on the command line. If the same
directory is named by both -I and
-isystem, the -I option is ignored. GCC provides an informative message
when this occurs if -v is used.
There is also a directive, #pragma GCC
system_header, which tells GCC to
consider the rest of the current
include file a system header, no
matter where it was found. Code that
comes before the #pragma
in the file
will not be affected. #pragma GCC
system_header has no effect in the
primary source file.