1. ホーム
  2. c++

[解決済み】GCCの警告を(文字通り)すべてオンにする方法は?

2022-04-07 01:53:19

質問

を有効にしたいのですが、文字通り すべて GCCが持つ警告の (簡単だと思うでしょうけど...)

  • あなたはこう思うでしょう -Wall しかし、そうではありません。まだ -Wextra .

  • と思うでしょう。 -Wextra しかし、そうではありません。リストアップされた警告のすべてが ここで (例えば -Wshadow ) が有効になっています。そして、このリストが包括的であるかどうかは、まだわかりません。

GCCに有効にするよう指示するにはどうしたらよいでしょうか(if, and, or but'sはなし!) すべて 警告を表示しますか?

解決方法は?

無理です。

GCC 4.4.0のマニュアルはそのバージョンについてだけ包括的ですが、4.4.0について考えられるすべての警告をリストアップしています。それらはあなたがリンクしたページにすべてあるわけではありません。たとえば、いくつかの言語固有のオプションはC++オプションやObj-Cオプションのページにあります。例えば、いくつかの言語固有のオプションは C++ のオプションや Obj-C のオプションのページにあります。 オプションの概要

をオンにする すべて を含めると -Wdouble-promotion を実装している 32 ビット単精度浮動小数点演算ユニットを持つ CPU にのみ関係します。 float をハードウェアでエミュレートしています。 double ソフトウェアで として計算を行う double を使うと、ソフトウェアエミュレーションを使うことになり、遅くなる。 これは一部の組み込み用CPUには関係しますが、64ビット浮動小数点をハードウェアでサポートする最新のデスクトップ用CPUには全く関係ありません。

また、通常は役に立たない警告として -Wtraditional これは、従来の C 言語では異なる意味を持つ (あるいは動作しない) 完全に整ったコードについて警告するもので、たとえば "string " "concatenation" またはISO Cの関数定義です。 30年前のコンパイラとの互換性を本当に気にしているのか?を書くと警告が出るのが本当にいいのでしょうか? int inc(int i) { return i+1; } ?

私が思うに -Weffc++ はノイズが多すぎて使い物にならないし、時代遅れの初版の エフェクティブ C++ を初期化していないことを警告されたくはありません。 std::string このコンストラクタは、私が望むことを正確に実行するデフォルトのコンストラクタを持っています。 m_str() を呼び出すことができますか? その -Weffc++ のような警告は、コンパイラが正確に検出するのが難しすぎる(偽陰性を与える)し、すべてのメンバーを明示的に初期化するような有用ではない警告は、ノイズが多すぎて偽陽性を与えてしまうだけです。

Luc Dantonは 素晴らしい例 からの無駄な警告の -Waggregate-return これは、C++のコードではほとんど意味をなさないものです。

つまり、本当に必要なのは すべて の警告が表示されることがありますが、これは自分がそう思っているだけです。

マニュアルに目を通し、それらについて読み、どれを有効にするかを決め、試してみてください。 コンパイラのマニュアルを読むのは良いことです。 TM とにかく、理解できない警告を短絡的に有効化することは、特にRTFMの必要性を回避するためであれば、あまり良いアイデアではありません。

をオンにするだけの人は すべて というのは、おそらく何も知らないからか、髪の尖った上司が「警告を出すな」と言ったか、どちらかでしょう。

警告には、重要なものとそうでないものがあります。 見極めないと、プログラムがめちゃくちゃになります。例えば、考えてみてください。 -Wdouble-promotion . もしあなたが組込みシステムで作業しているならば、これは必要かもしれませんが、もしデスクトップシステムで作業しているならば、おそらく必要ないでしょう。 では -Wtraditional ? そうでしょうか。

編集する こちらもご覧ください -Wall-all はすべての警告を有効にします。 として閉じられているWONTFIX。

2を編集します。 DevSolarから、コンパイラのバージョンによってmakefileが異なる警告を使う必要があるという苦情を受けて、もし -Wall -Wextra を使えば、コンパイラ固有のCFLAGとバージョン固有のCFLAGを使うことは難しくありません。

compiler_name := $(notdir $(CC))
ifeq ($(compiler_name),gcc)
compiler_version := $(basename $(shell $(CC) -dumpversion))
endif
ifeq ($(compile_name),clang)
compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}')
endif
# ...
wflags.gcc.base := -Wall -Wextra
wflags.gcc.4.7 := -Wzero-as-null-pointer-constant
wflags.gcc.4.8 := $(wflags.gcc.4.7)
wflags.clang.base := -Wall -Wextra
wflags.clang.3.2 := -Weverything
CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version))