C++と色々

主にC++やプログラムに関する記事を投稿します。

Visual C++でIntellisenseの警告を抑止する方法

結論

#pragma warning(push, 0)コンパイラの警告を抑止し、 #pragma warning(disable: ALL_CODE_ANALYSIS_WARNINGS でインテリセンスの警告を抑止できる。

#pragma warning(push, 0)
#include <CodeAnalysis/Warnings.h>
#pragma warning(disable: ALL_CODE_ANALYSIS_WARNINGS)
#include <third_party.h>
#pragma warning(pop)

経緯

Visual C++にはCppCoreCheckerという機能があります。

devblogs.microsoft.com

CppCoreCheckerはCppCoreGuidelinesに基づいたlinterです。

isocpp.github.io

コンパイラの警告以上に幅広くより良いコードの書き方を指摘してもらえるため、基本的に有効にしたほうが良いと思います。

CppCoreCheckerの設定を有効にしている様子
CppCoreChecker

しかし、有効にしたときに1つ問題が起きます。それは標準ライブラリやサードパーティのヘッダで警告が出てしまうことです。

それらに手を加えることはできませんし、自分たちのコードの警告のノイズになるため、外部ヘッダでの警告は抑止しましょう。

コンパイラの警告であれば #pragma warning(push, 0) と書くと、 #pragma warning(pop) するまでの間警告レベルを0にすることができます。

docs.microsoft.com

しかし #pragma warning(push, 0) で抑止できるのは コンパイラの警告のみ です。Intellisenseの警告は相変わらず表示されます。そしてCppCoreCheckerの警告はほぼIntelSenseの警告となっています。

Intellisenseの警告を抑止するには明示的に #pragma warning(disable: xx ) でIDを指定する必要があります。しかしたくさんあるIntellisenseの警告を手で列挙していくのは現実的ではありません。 そこで丁度、全てのコード分析に関連する警告のIDが記述されたマクロが提供されています。それが <codeanalysis/warnings.h> です。このヘッダの中に ALL_CODE_ANALYSIS_WARNINGS というマクロ定数が提供されています。

docs.microsoft.com

ちなみに <CppCoreCheck/Warnings.h> というヘッダも提供されていますが、こちらはCppCoreCheckerに関係する警告が列挙されており、 <CodeAnalysis/Warnings.h> は CppCoreCheckを含みそれ以外のコード分析の警告も列挙されているため <CodeAnalysis/Warnings.h> の方が対象の警告の範囲が広いです。

以下のように書くことで外部ヘッダの区間のみコンパイラの警告とIntellisenseの警告を抑止することができます

#pragma warning(push, 0)
#include <CodeAnalysis/Warnings.h>
#pragma warning(disable: ALL_CODE_ANALYSIS_WARNINGS)
#include <third_party.h>
#pragma warning(pop)