84

特定のインクルード ファイルによって直接的または間接的にインクルードされるすべてのファイルに対して、特定の警告を無効にしたいと考えています。たとえば、「文字列リテラルを char* に割り当てています」という警告を無効にしたいと考えています#include <bar/*>

その理由は、私がプログラミングしなければならない人の中には、「const」を使用できない人もいるため、最終的には、その特定の文字列リテラルの乱用について多くの警告を受け取るからです。彼らのコードから来る何千もの警告を無視したいので、自分のコードの間違いに集中して修正することができます。

Intel C++ と GCC を使用しています。私の仲間の何人かはclangを使用しているので、その解決策も聞いてうれしいです.

4

5 に答える 5

73

GCC を使用する場合、-isystemフラグの代わりに-Iフラグを使用して、その場所からの警告を無効にすることができます。

したがって、現在使用している場合

gcc -Iparent/path/of/bar …

使用する

gcc -isystem parent/path/of/bar …

代わりは。残念ながら、これは特に細かいコントロールではありません。私は、よりターゲットを絞ったメカニズムを認識していません。

于 2011-06-12T12:27:49.043 に答える
38

私が使用しているときに、通常のデフォルトの&cog++で大量の警告を生成するサードパーティのヘッダーがあります。-Wall -Wextra私はそれらを別々のインクルードにグループ化し、を指定する傾向があります。system_header #pragma

[...] GCCは、システムヘッダーにあるコードを特別に扱います。#warningGCCがシステムヘッダーを処理している間、(診断を参照)によって生成されたものを除くすべての警告が抑制されます。システムヘッダーで定義されたマクロは、展開される場所に関係なく、いくつかの警告の影響を受けません。この免除は、システムヘッダーで定義されたマクロのコードが原因で警告が多くの誤検知を生成することがわかった場合に、アドホックベースで付与されます。

[...]

ディレクティブもあります#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
于 2011-06-12T12:37:41.667 に答える
0

最も簡単な解決策は、ファイル名と警告の種類に基づいて、コンパイラを呼び出し、コンパイルし、不要な出力を削除する簡単なスクリプトを作成することだと思います。コンパイラごとに異なるスクリプトを使用できます。

コンパイラを直接呼び出す代わりに、このスクリプトを使用するようにメイクファイルを更新するだけです。

于 2011-06-12T12:23:08.867 に答える