78

たまに、警告をまったく出さないC++コードを書くのは難しいです。ただし、警告を有効にすることをお勧めします。そのため、特定の構成に関する警告を無効にし、他のすべてのコードで有効にする必要がある場合がよくあります。

これまでに2つの方法を見てきました。

最初のものは使用すること#pragma warning( push )です#pragma warning( pop )

 #pragma warning( push )
 #pragma warning( disable: ThatWarning )
 //code with ThatWarning here
 #pragma warning( pop )

2番目は使用すること#pragma warning( default )です:

 #pragma warning( disable: ThatWarning )
 //code with ThatWarning here
 #pragma warning( default: ThatWarning )

2番目のバリアントで見られる問題は、元の警告レベルが破棄されることです。その前に警告がオフになっていたか、警告レベルが変更されている可能性があります。を使用defaultすると、これらの変更は破棄されます。

最初のアプローチはきれいに見えます。何か問題はありますか?同じことを達成するためのより良い方法はありますか?

4

7 に答える 7

48

これは、複数のコンパイラ(および異なるバージョンのコンパイラ)で機能します。

ヘッダー「プッシュ」

#if defined(__clang__)
# pragma clang diagnostic push
#endif

#if defined(_MSC_VER)
# pragma warning(push)
#endif

#if defined(YOUR_FAVORITE_COMPILER)
# pragma your compiler push warning
#endif

ヘッダー「ポップ」

#if defined(__clang__)
# pragma clang diagnostic pop
#endif

#if defined(_MSC_VER)
# pragma warning(pop)
#endif

警告

#if defined(__clang__)
# pragma clang diagnostic ignored "-Wunused-parameter"
# pragma clang diagnostic ignored "-Wunused-variable"
#  if __has_warning("-Wnew-special-warning")
#   pragma clang diagnostic ignored "-Wnew-special-warning"
#  endif
#endif

#if defined(_MSC_VER)
# pragma warning(disable: 4100) // unreferenced formal parameter
# if _MSC_VER > _MSC_SOME_VERSION
#  pragma warning(disable: xxxx) // disable one more for special version
# endif
#endif

使用法

// This code reports warnings
// ...
#include <ignore_compiler_warning/push>
#include <ignore_compiler_warning/warning_type_1>
#include <ignore_compiler_warning/warning_type_2>
#include <ignore_compiler_warning/warning_type_3>
// This code ignores warnings type_{1,2,3}
// ...
#include <ignore_compiler_warning/pop>
// Back to reporting warnings
// ...

さらに、警備員を含めて、ダブルプッシュ/ポップ/無効化警告プラグマがないことを確認できます。

アップデート

于 2013-08-27T11:21:53.157 に答える
41

最初の方法は、それを行うための最良の方法、IMOです。私はそれで問題がないことを知っています。

#pragmaはコンパイラ固有であるため、すべてのコンパイラで機能することを期待しないでください:)

于 2010-11-16T11:08:45.663 に答える
41

鋭い歯には遅すぎますが、そこにいるすべてのグーグルにとっては:

#pragma warning ( suppress: ThatWarning )
// one single line with ThatWarning

の略語です(通常はVS 2008以降ですが、VS 2005ではコードアナライザーの警告のみ):

#pragma warning ( push )
#pragma warning ( disable: ThatWarning )
// one single line with ThatWarning
#pragma warning ( pop )
于 2013-08-27T09:12:25.583 に答える
13

正しいアプローチ(少し醜いですが)

#ifdef _MSC_VER
 #pragma warning( push )
 #pragma warning( once: ThatWarning )
#endif
 //code with ThatWarning here
#ifdef _MSC_VER
 #pragma warning( pop )
#endif
于 2010-11-16T12:20:44.623 に答える
3

プロジェクトまたはファイルオプションで特定の警告を無効にすることができます。この設定は、関連するスコープの#pragmasごとに「デフォルト」として適用されます。VS2005の警告のいくつかは、非常に役に立たない/煩わしいので、を使用すると、出力がかなりクリーンアップされます/W4

これは、[構成のプロパティ]-> [C /C++]->[詳細設定]の[プロパティ]にあります。

于 2010-11-16T12:30:43.527 に答える
2

最初のバリアントには問題はありません。より良い方法は、以下を使用することです。

 #pragma warning( push )
 #pragma warning( once: ThatWarning )
 //code with ThatWarning here
 #pragma warning( pop )

これにより、コードにまだ警告が含まれていることがわかりますが、警告メッセージはそれほど煩わしいものではありません。しかし、それは好みの問題です。

于 2010-11-16T11:22:18.233 に答える
0

最初のアプローチでは、ローカルスコープの特定の警告設定を変更できます。最初にスタックにプッシュして現在のすべての警告状態を保存し、警告の変更を適用してから、最後の警告状態に復元(ポップ)します。

#pragma warning(push)#pragma warning(once:ThatWarning)//ここでThatWarningを使用してコード化#pragma warning(pop)

于 2020-04-23T18:01:13.303 に答える