web-dev-qa-db-ja.com

プラグマを使用してすべての警告を無効にする方法はありますか?

新しいプロジェクトを開始し、/ Wallオプションを有効にしてプロジェクトが正常にビルドされることを確認することにしました。唯一の問題は、すべてのサードパーティライブラリ(ブーストなど)が警告なしにコンパイルされるわけではないため、共有ヘッダーでこれを行うことにしました。

#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)

これは十分に機能しますが、新しいブーストヘッダーを追加するたびに、それらが生成する警告をリストに追加する必要があります。この一連のコードのすべての警告を無効にするという方法はありますか?

38
Ferruccio

次のように、低レベルの警告をプッシュ/ポップできます。

#pragma warning(Push, 0)        

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

#pragma warning(pop)

ただし、all警告を無効にすることはできません。たとえば、一部のリンカー警告はオフにできません。

49
Assaf Lavie
#pragma warning(disable:4820)
#pragma warning(disable:4619)
#pragma warning(disable:4668)

行数が少ない場合...

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

私が以前に行ったことは、「壁」ではなく「W3」オプションを設定してから、自分のソース.cppファイルのそれぞれに設定することです。

#pragma warning(Push, 4)

すべての「#include ...」行の後の上部にあり、その後

#pragma warning(pop)

ファイルの最後の行として。

このようにして、コードでレベル4の警告を受け取り、サードパーティのコードでレベル3の警告を受け取ります。これについては何もできません。

5
Matt Warren

Assaf Lavieの回答 で説明されている手法を使用すると、ヘルパーマクロを作成できます。

#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 not wrapped inside "DISABLE_ALL_WARNINGS" section
}
DISABLE_ALL_WARNINGS_END
2
PolarBear