Visual C++: pragma warning

It is a good practice to compile code at the highest warning level available from the compiler. When the compiler reports warnings on the code, the code should be fixed so that it compiles with zero warnings. But, sometimes this is not possible, for example, if the source of the warnings are headers included from external libraries. Common C++ libraries like Boost and special libraries like CGAL (Computational Geometry Algorithms Library) are notorious for introducing hundreds of warnings when their header files are included.

In Visual C++, the #pragma warning compiler directive is an effective way to disable these specific warnings. There are many specifiers that can be specified with #pragma warning. Here are a couple that I find most useful:

Warnings that are reported have an identifier and a textual message. The identifier is of the form CXXXX, where XXXX is the warning number. The disable specifier can be used to disable a specific warning, say C1234:

#pragma warning(disable: 1234)

The disabling of warnings should be localized as much as possible. This can be done using the push and pop specifiers around the offending code.

#pragma warning(push)
#pragma warning(disable: 1234)
// Offending code that produces C1234 warning goes here
#pragma warning(pop)

#pragma warning directives can be placed in header files or in source files. When the directive needs to be used across an entire source file or many files, one can get lazy and place it in a header that is included in all these files. This is not a good practice since the warning will be disabled for all the source files that include that header now or in the future.

I prefer placing directives at the source file level, so that their effect is localized to the source file. If one is placing the directive at the source file, it should be put at the top, even above the header files inclusion, to be effective:

// Foo.cpp
#pragma warning(disable: 1234)
#include "Foo.h"

Foo::Foo()
{ /***/ }

2 thoughts on “Visual C++: pragma warning

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.