47

さまざまな C/C++ コンパイラに対して、どのコンパイラ警告レベルをお勧めしますか?

gcc と g++ を使用すると、デフォルト レベルで多くのことを回避できます。私にとって最適な警告レベルは「-Wall」です。そして、私は常に、それが生成する警告のコードを削除しようとします. (論理的な優先順位規則に括弧を使用することや、私が本当に「if (x = y)」を意味すると言う愚かな人でさえ)

Sun CC、aCC (HPUX ?)、Visual Studio、intel など、さまざまなコンパイラのお気に入りのレベルは何ですか?

編集:

gcc/g++ では「-Werror」を使用していないことを指摘したかっただけです (ただし、ユーティリティであることは理解しています)。

#警告「これは自分へのメモです」

私のコードのいくつかの場所で。すべてのコンパイラが #warning マクロを理解していますか?

4

14 に答える 14

50

これは、C++コードに使用しているパラノイドフラグのセットです。

    -g -O -Wall -Weffc++ -pedantic  \
    -pedantic-errors -Wextra -Waggregate-return -Wcast-align \
    -Wcast-qual  -Wchar-subscripts  -Wcomment -Wconversion \
    -Wdisabled-optimization \
    -Werror -Wfloat-equal  -Wformat  -Wformat=2 \
    -Wformat-nonliteral -Wformat-security  \
    -Wformat-y2k \
    -Wimplicit  -Wimport  -Winit-self  -Winline \
    -Winvalid-pch   \
    -Wunsafe-loop-optimizations  -Wlong-long -Wmissing-braces \
    -Wmissing-field-initializers -Wmissing-format-attribute   \
    -Wmissing-include-dirs -Wmissing-noreturn \
    -Wpacked  -Wpadded -Wparentheses  -Wpointer-arith \
    -Wredundant-decls -Wreturn-type \
    -Wsequence-point  -Wshadow -Wsign-compare  -Wstack-protector \
    -Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch  -Wswitch-default \
    -Wswitch-enum -Wtrigraphs  -Wuninitialized \
    -Wunknown-pragmas  -Wunreachable-code -Wunused \
    -Wunused-function  -Wunused-label  -Wunused-parameter \
    -Wunused-value  -Wunused-variable  -Wvariadic-macros \
    -Wvolatile-register-var  -Wwrite-strings

それはあなたに始めるための何かを与えるはずです。プロジェクトによっては、サードパーティのライブラリからの警告が表示されないようにするために、トーンダウンする必要がある場合があります(通常、警告がないことについてはかなり不注意です)。たとえば、Boostベクトル/マトリックスコードを使用すると、g++が大量に放出されます。ノイズの。

このような場合を処理するためのより良い方法は、最大に調整された警告を引き続き使用するが、特定のファイル/行番号で警告が表示されないようにするg++のラッパーを作成することです。私はずっと前にそのようなツールを書きました、そして私がそれをきれいにする時間があればそれをリリースするでしょう。

于 2008-12-30T19:47:49.107 に答える
24

Visual C++ では、/W4and /WX(警告をエラーとして扱います) を使用します。

VC にも がありますが/Wall、標準ヘッダーとは互換性がありません。

私は警告をエラーとして扱うことにしました。警告を無視するように追加することを意味する場合でも、すべての警告を修正します。#pragmaそのようにして、警告を認識していることを明示的に述べています (したがって、他の開発者はそれについて電子メールを送信しません)。

于 2008-12-30T09:32:20.127 に答える
14

VCもサポートしていると思います

#pragma message ("note to self")

しかし、システムがどんどん大きくなり、30 人の開発者が同時に作業する毎晩のビルドができるようになると、すべてのメモを自分自身に読むのに何日もかかります。追いつけずに辞めざるを得ないストレスに打ちのめされる…

いいえ、そうではありません。警告を許可すると、警告の量が急速に増加し、本当に重要なもの (初期化されていない変数、コンストラクターで使用されるこのポインターなど) を見つけることができなくなります。

そのため、私は警告をエラーとして扱うようにしています。ほとんどの場合、コンパイラは正しく警告しており、そうでない場合は、それをコードに記録して先頭に追加します。

#pragma warning ( push )
#pragma warning ( 4191 : disable )
// violent code, properly documented
#pragma warning ( pop )

プラグマもあると読んだばかりです。warning ( N : suppress )

于 2008-12-30T09:59:42.117 に答える
10

-Wall私は(誰もがバグを作るため、誰も完璧ではない)を使用する傾向がありますが、 -Werror(警告をエラーとして扱う) は使用しません。

于 2008-12-30T09:24:43.123 に答える
8

-Wall を常に使用する litb に同意します。さらに、コードが準拠していることを確認したい場合は、-pedantic も使用できます。バイト レベルで共用体と構造体を処理している場合に役立つ別の警告は、-Wpadded です。

于 2008-12-30T09:34:19.623 に答える
4

私はすべての開発を、エラーをオンにして警告を表示して行います。

私はまだ VC6 で開発しているので、コードには多くの #pragma があります (主に 4786)。

于 2008-12-30T11:04:38.273 に答える
3

GCC では、好みで を使用し-Wall -Wextra -Wwrite-strings -Werror、 で標準も指定しますstd=。どの標準がプロジェクトに依存するかは、主にどの程度の移植性が必要かによるものです。

私が使用する理由-Werrorは、警告が実際のバグを表していなくても (私にとっては) 受け入れられないからです。残りの人生でコンパイルするたびに警告を無視するよりも、警告の原因を回避したいと思います。コンパイルで警告を許可すると、前回は存在しなかった警告を簡単に見逃してしまいます。

もちろん、サードパーティのコードを扱う場合、警告を取り除くことができない場合があります。次に、オプションを緩和するか、スクリプトを-W削除-Werrorして記述して警告のみが発生するかを確認するか、サードパーティのコードを変更するか (警告を「修正」するか、可能であれば、プラグマで無効にします)。

于 2008-12-31T01:30:35.217 に答える
3

ここにGCCのオプションの素晴らしいリストがあります:http://mces.blogspot.com/2008/12/year-end-cleaning-ie-on-warning-options.htm . -Wall は考えられるすべての警告を有効にするわけではなく、一部は明示的に有効にする必要があります。

于 2008-12-30T11:17:55.767 に答える
3

-Wall と厳密なプロトタイプ、および暗黙の関数定義が好きです。それらのエラーは非常に役立ちます。-Wextra もあります。これは、条件付きにするつもりだったが誤ってステートメントとして書いたものなど、あらゆる種類のものをピックアップします。

if (something);
   classic_way_to_leak_memory();

Unix ライクなシステムでは、ユーザーの ENV 設定に従わなければなりません..そのため、彼らが見たり報告したりするものは、あなたが必要としているものとは完全に異なるかもしれません:)

私はまた、型をからかった悪鬼でもあるので、ユーザーが望まない限り、-Fno-strict-aliasing も設定する傾向があります。従来の C での安全なメモリ管理は、それ以外の方法では実現が困難です。

于 2008-12-30T11:11:18.400 に答える
1

Visual CI では /w3 を使用します。私は、w4 があまりにも多くのノイズ (MS ライブラリからの多くのノイズ) をスローして、すべてのビルドを処理できないことを発見しました。追加の警告は非常に軽微であり、これまでのところバグの原因にはなっていません。

于 2008-12-30T09:50:20.373 に答える
0

回答ありがとうございます。gcc/g++ 以外を使ってからしばらく経ちました。私がずっと前に使用しなければならなかったものは

-fmessage-length = 0 (g++ には改行メッセージという醜い癖があったため)

-Wno-deprecated (std 名前空間の既存のコード ベースで作業したため)

(少なくとも 5 年前) Sun Workshop CC コンパイラのデフォルトの警告レベルを超えるものは多すぎたことを覚えています。これはインテルのコンパイラーにも当てはまると思います。私はしばらくの間、非 gnu コンパイラについて最新の情報を入手していません。

于 2008-12-30T17:34:37.673 に答える
0

GCC コンパイラは、新しいバージョンごとに厳密になっています。このフラグ-ansiを使用して、ANSI 言語標準の最も厳密な解釈に違反した場合に警告を生成します。これは通常、現在のコンパイラでたまたま機能するものですが、次のバージョンや他のコンパイラではエラーが発生する可能性があります。このフラグを使用すると、コンパイラ/バージョンを切り替えるたびにコードを移植する必要がなくなります。

于 2008-12-30T21:09:05.540 に答える