web-dev-qa-db-ja.com

特定の不明な#pragma警告を無効にする方法は? (GCCおよび/またはclang)

私はall不明な#pragma警告を無効にする方法を知っています。答えは、例えば、ここに与えられました: SO:#pragma警告を無効にする方法?

私の質問は-特定のプラグマの「不明なプラグマ」警告を無効にする方法はありますか?たとえば、#pragma ugubuguの警告を無効にすると、次のコードが表示されます。

#pragma ugubugu
#pragma untiunti   
int main() {return 0;}

次のいずれかでコンパイルした場合:

g++ pragma.cpp -Wall
clang++ pragma.cpp -Wall

警告が1つ生成されるはずです。

warning: ignoring #pragma untiunti

たぶん、たとえば、何もしないカスタムプラグマを登録する簡単な方法はありますか?

そのようなオプションがVisual Studioにもあるかどうかを知るのは素晴らしいことですが、それはそれほど重要ではありません。

ありがとうございました!


「しかし、なぜ彼は最終的にカスタムプラグマで遊んでいるのですか?」

私のソースは2つのコンパイラーによって解析されます。そのうちの1つには、他には知られていない特別な#pragmaがあります。もちろん、#ifdef COMPILER_IDENTIFICATION_MACRO ... #endifのすべてのインスタンスの周りに#pragmaを置くこともできますが、それは面倒です。

25
CygnusX1

これを行う方法はないと確信しています。

GCCとClangの両方に内部インターフェイスがあり、言語のフロントエンドが#pragmaハンドラーをプリプロセッサーに登録できます-GCCのlibcpp/directives.cとClangのlib/Lex/Pragma.cppを参照してください-しかし、私が見る限りでは、コマンドラインオプションに基づいて、登録されているハンドラーを(コンパイル対象の言語バリアントによって暗示されているものを超えて)変更できるものはありません。

私はall不明な#pragma警告を無効にする方法を知っています。答えは、例えば、ここに与えられました: SO:#pragma警告を無効にする方法?

最も投票数の多い回答が、そこで承認された回答よりも優れていることに注意してください。 -Wno-unknown-pragmasは、警告をオンにする(-Wallのような)何でもafterの後にコマンドラインで追加できます。

私のソースは2つのコンパイラーによって解析されます。そのうちの1つには、他には知られていない特別な#pragmaがあります。もちろん、#ifdef COMPILER_IDENTIFICATION_MACRO ... #endifのすべてのインスタンスの周りに#pragmaを配置することもできますが、これは面倒です。

より哲学的な観点からは、これは本当に正しい解決策だと思います。

#pragmaは、実装を呼び出すためのメカニズムを提供することを目的としているため、意図したとおりに#pragmaをコンパイラから非表示にすることは私には正しいようです。コンパイラで定義された動作。

(これを行うと、Clangは__clang__を定義しますが、bothGCCとClangは__GNUC__を定義することに注意してください。)

18

プラグマの警告は、あるプラットフォームでは有効で別のプラットフォームでは有効ではないため、無効にしたいと思います。その場合は、マクロを使用してプラグマを選択的に有効にすると、警告を抑制する必要がなくなります。

たとえば、Visual C++でのみプラグマが必要な場合は、次のようにできます。

#if defined(_MSC_VER)
#    define SAFE_PRAGMA_UGUBUGU __pragma(ugubugu)
#else
#    define SAFE_PRAGMA_UGUBUGU 
#endif

そして、あなたは書くことができます

SAFE_PRAGMA_UGUBUGU
#pragma untiunti   
int main() {return 0;}
5
sffc