19

次のファイル (temp.cpp) をコンパイルします。

#include <iostream> 

class Foo {
public:
  Foo() = default;
};

int main(){
  std::cout << "Works!" << std::endl;
  return 0;
}

次のコマンドを使用します。clang++ temp.cpp -o temp -std=c++11 -Weverything -Werror

エラーがあります:

temp.cpp:5:11: エラー: デフォルトの関数定義は C++98 と互換性がありません [-Werror,-Wc++98-compat]

c++98-compat のような警告があり、それがすべての一部であることを理解しています。c++98-compat 以外のすべての警告を有効にするにはどうすればよいですか? -Weverything 用の c++11 互換フラグはありますか?

4

1 に答える 1

36

実際には、おそらくすべての警告が必要なわけではありません。多くの警告は文体的または主観的であると見なすことができ、他の警告 (あなたが遭遇した警告など) はあなたの状況では単にばかげているだけだからです。

-Weverythingは当初、次の 2 つの理由で作成されました。

  • 発見: それ以外の場合、利用可能なすべての警告のリストを取得するのはかなり困難です
  • ブラックリストの代替手段: gcc では、適用したい警告をチェリー ピックし (ホワイト リスト)、適用-Weverythingしたくない警告をチェリー ピックします。利点は、新しいバージョンのコンパイラに移行するときに、新しい警告の恩恵を受ける可能性が高くなることです。

明らかに、ディスカバリーは本番環境での使用と実際には互換性がありません。したがって、あなたはブラックリストのケースに該当するようです。

Clang 診断システムは、(デフォルトで) 警告の生成を担当する最も具体的な警告グループの名前を出力し (ここでは-Wc++98-compat)、各警告グループはno--W.

したがって、ブラックリストに登録すると、次のようになります。

-Weverything -Wno-c++98-compat -Wno-...

また、ブラックリストに記載された警告のリストを随時修正することをお勧めします (たとえば、新しいコンパイラにアップグレードする場合)。

于 2013-01-06T18:50:20.807 に答える