1. ホーム
  2. c++

[解決済み】なぜ常にコンパイラの警告を有効にしなければならないのですか?

2022-03-26 17:05:08

質問

CやC++のプログラムをコンパイルするとき、「コンパイラの警告を常に有効にすること」とよく聞きます。なぜ、このようなことが必要なのでしょうか?どうすればいいのでしょうか?

また、「警告はエラーとして扱え」と言われることがあります。そうすべきでしょうか?どうすればいいのでしょうか?

どのように解決するのですか?

なぜ警告を有効にしなければならないのですか?

CおよびC++コンパイラは、プログラマがよく犯す間違いを報告するのが苦手なことで有名です。 デフォルトでは などのように。

  • 変数の初期化忘れ
  • 忘れがち return 関数からの値
  • の引数です。 printfscanf ファミリーがフォーマット文字列にマッチしない
  • 関数が事前に宣言されずに使用されている (C言語のみ)

この機能は、コンパイラのオプションで明示的に要求する必要があります。

警告を有効にするにはどうすればよいですか?

これは、お使いのコンパイラに依存します。

Microsoft CおよびC++コンパイラは、以下のようなスイッチを理解します。 /W1 , /W2 , /W3 , /W4/Wall . 少なくとも /W3 . /W4/Wall は、システムヘッダーファイルに対して偽の警告を出すかもしれませんが、もしあなたのプロジェクトがこれらのオプションのいずれかできれいにコンパイルできるのであれば、それを使ってください。これらのオプションは互いに排他的です。

他のほとんどのコンパイラは、以下のようなオプションを理解します。 -Wall , -Wpedantic そして -Wextra . -Wall は必須で、残りはすべて推奨です(なお、その名前にもかかわらず。 -Wall は最も重要な警告だけを有効にするのであって すべて を含む)。これらのオプションは別々に、またはすべて一緒に使用することができます。

IDEには、ユーザー・インターフェースからこれらを有効にする方法があるかもしれません。

なぜ警告をエラーとして扱わなければならないのですか?ただの警告です!

コンパイラの警告は、あなたのコードに潜在する深刻な問題を知らせるものです。上記のような問題は、ほとんどの場合致命的です。 であっても 誤報であることが判明しました。それぞれの警告を調査し、根本的な原因を突き止め、それを解決する。誤報の場合は、警告が出ないように別の言語機能または構造を使用する。それが難しい場合は、ケースバイケースでその警告を無効にしてください。

警告のすべてが誤報であっても、警告を警告のままにしておくのは好ましくありません。警告の総発生数が7件以下の非常に小規模なプロジェクトでは問題ないでしょう。それ以上だと、新しい警告が見慣れた古い警告の洪水の中に紛れ込んでしまいがちです。それを許さないでください。すべてのプロジェクトがクリーンにコンパイルできるようにしましょう。

これはプログラム開発に適用されることに注意してください。もし、あなたのプロジェクトをソースとして世に問うのであれば、このように -Werror またはそれに相当するものを リリース ビルドスクリプトを使用します。他の人があなたのプロジェクトを別のバージョンのコンパイラで、あるいはまったく別のコンパイラでビルドしようとするかもしれませんし、別の警告のセットが有効になっているかもしれません。そのような場合、ビルドを成功させたいと思うかもしれません。警告メッセージを見た人がバグレポートやパッチを送ることができるように、警告を有効にしておくことは良いアイデアです。

警告をエラーとして扱うにはどうしたらよいですか?

これもコンパイラのスイッチで行います。 /WX はマイクロソフト用で、他のほとんどは -Werror . いずれの場合も、警告が発生した場合はコンパイルに失敗します。

これでいいのか?

おそらく、そうではないでしょう。最適化レベルを上げると、コンパイラはより詳細にコードを見るようになり、この詳細な調査によって、より多くの間違いが明らかになる可能性があります。したがって、警告スイッチだけで満足せず、常に最適化を有効にした状態でコンパイルしてください ( -O2 または -O3 または /O2 MSVCを使用している場合)。