特定のインクルードファイルによって直接または間接的にインクルードされるすべてのファイルの特定の警告を無効にしたいと思います。たとえば、すべてのファイルまたは#include <bar/*>
に含まれるファイルに含まれるファイルに対して、「文字列リテラルをchar *に割り当てています」という警告を無効にしたい(私の場合、星は")。
理由は、私がプログラムしなければならない人の中には「const」を使用できないものがあるため、最終的にその特定の文字列リテラルの乱用について多くの警告が出ます。それらのコードから発生する何千もの警告を無視したいので、自分のコードの間違いに集中して修正することができます。
Intel C++とGCCを使用しています。私の仲間の一部はclangを使用しているので、そのための解決策も喜んで聞きます。
GCCを使用する場合、-isystem
フラグの代わりに-I
フラグを使用して、その場所からの警告を無効にすることができます。
そのため、現在使用している場合
gcc -Iparent/path/of/bar …
使用する
gcc -isystem parent/path/of/bar …
代わりに。残念ながら、これは特にきめ細かい制御ではありません。私は、よりターゲットを絞ったメカニズムを知りません。
より良いGCCソリューション:#pragmaを使用します。
#pragma GCC diagnostic Push
#pragma GCC diagnostic ignored "-W<evil-option>"
#include <evil_file>
#pragma GCC diagnostic pop
例えば:
#pragma GCC diagnostic Push
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include <QtXmlPatterns>
#pragma GCC diagnostic pop
g++
を使用し、通常のデフォルトの-Wall -Wextra
&coで大量の警告を生成するサードパーティのヘッダーがある場合。 system_header
#pragma
を指定して、それらを個別のインクルードにグループ化する傾向があります。
[...] GCCは、システムヘッダーにあるコードに特別な扱いを与えます。 GCCがシステムヘッダーを処理している間、
#warning
(診断を参照)によって生成されるもの以外のすべての警告は抑制されます。システムヘッダーで定義されたマクロは、展開された場所でいくつかの警告を受けません。この免責は、システムヘッダーで定義されたマクロ内のコードが原因で警告が多くの誤検知を生成することが判明した場合に、アドホックに付与されます。[...]
ディレクティブ
#pragma GCC system_header
もあります。これは、GCCに、現在のインクルードファイルの残りの部分を、それが見つかった場所に関係なくシステムヘッダーと見なすように指示します。ファイル内の#pragma
の前にあるコードは影響を受けません。#pragma GCC system_header
は、プライマリソースファイルには影響しません。
このソリューションは-isystem
の方がよりきめ細かく、コマンドライン引数やインクルードディレクトリを使いすぎずにソースに直接配置できるため、このソリューションの方が好きです。
恐ろしいルートライブラリを使用した例:
#ifndef ROOTHEADERS_HPP_INCLUDED
#define ROOTHEADERS_HPP_INCLUDED
#ifdef __GNUC__
// Avoid tons of warnings with root code
#pragma GCC system_header
#endif
#include "TH1F.h"
#include "TApplication.h"
#include "TGraph.h"
#include "TGraph2D.h"
#include "TCanvas.h"
#endif
最も簡単な解決策は、ファイル名と警告の種類に基づいて、コンパイラを呼び出し、コンパイルし、望ましくない出力を削除する単純なスクリプトを書くことだと思います。コンパイラごとに異なるスクリプトを使用できます。
コンパイラを直接呼び出す代わりに、このスクリプトを使用するようにメイクファイルを更新するだけです。