[解決済み】なぜ常にコンパイラの警告を有効にしなければならないのですか?
質問
CやC++のプログラムをコンパイルするとき、「コンパイラの警告を常に有効にすること」とよく聞きます。なぜ、このようなことが必要なのでしょうか?どうすればいいのでしょうか?
また、「警告はエラーとして扱え」と言われることがあります。そうすべきでしょうか?どうすればいいのでしょうか?
どのように解決するのですか?
なぜ警告を有効にしなければならないのですか?
CおよびC++コンパイラは、プログラマがよく犯す間違いを報告するのが苦手なことで有名です。 デフォルトでは などのように。
- 変数の初期化忘れ
-
忘れがち
return
関数からの値 -
の引数です。
printf
とscanf
ファミリーがフォーマット文字列にマッチしない - 関数が事前に宣言されずに使用されている (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を使用している場合)。
関連
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された