1

編集: GCC を使用してサードパーティ コードからの警告を無効にする方法を見つけました。この投稿をここで見てください: http://sphaleron.blogspot.se/2011/06/ignoring-gcc-warnings-on-per-file-basis.html またはbames53の投稿が言ったように!

GCC コンパイラをアップグレードしたところ、突然、これまでにない警告が大量に表示されました。基本的に、Sint16 にする必要があることを指定しない場合、それらのすべてが int から Sin16 への変換です。

以下の例では、このような警告がスローされます。

int number = 6;
SDL_Rect rect = {number, number, number, number};

SDL_Rect は入力として Sint16 を想定しています。とにかく、私はこれらの警告を修正し始めていました (理由は?) 新しいものをチェックしたときに、OpenGL でより効率的に描画できるように追加した glew ファイルから 100 を超える警告を受け取りました。警告を修正するためだけにそのコードに入る予定はありません。

あなたは何をしたでしょうか?これはどれほど重要ですか?それらを修正しない場合、これらの警告を削除する方法はありますか?

明確化: 私は常に、より深刻な警告を修正します。コードからのすべての警告が狭められた警告であるというだけです (glew.c では、"警告: '変数' が dllimport 属性なしで再宣言されました: 以前の dllimport は無視されました [-Wattributes]| ") であり、私は特に glew が私にたくさんのことを投げかけたので、これらを修正することがどれほど重要か疑問に思っています.

4

3 に答える 3

3

あなたのプロジェクトは常に警告なしである必要があります。警告をエラーとして扱うようにコンパイラを設定することは、開発者が警告のない状態を維持するように奨励する良い方法ですが、特定の時点で簡単に修正できるという理由だけで、修正する必要がある警告が無効にならないように注意する必要があります。 . 警告を無効にするには、レビューが必要です。

サードパーティのヘッダーなどに含まれているために修正できない警告は、沈黙させる必要があります。そうしないと、出力にノイズが追加され、修正可能で修正が必要な警告が隠される可能性があります。

警告のソースが比較的ローカライズされている場合は、ソース内のその場所だけを無効にすることができます:

// VC++
#pragma warning(push)
#pragma warning( disable : 4507 34)
#include <third_party_header.h>
#pragma warning(pop)

// clang
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"
#include <third_party_header.h>
#pragma clang diagnostic pop

// GCC
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
#include <third_party_header.h>
#pragma GCC diagnostic pop

多くの場所で警告が発生し、それらが何らかの誤検知であるために修正できない場合は、コンパイラ フラグを使用して、プロジェクト全体 (または場合によってはモジュール) で警告を無効にすることを検討できます。

VC++:/wd4507

GCC/クラン:-Wno-uninitialized


また、無効化されたすべての警告を定期的に再評価して、コードベースとツールチェーンが進化しても無効化の理由が引き続き有効であることを確認する必要があります。また、有効にできる、導入された新しい警告を探します。


clang には、新しい警告を発見するための便利なツールがあります。-Weverything旗。GCC と clang の両方で、-Wall実際には、コンパイラ開発者が広く適用可能であり、比較的厳しい誤検出要件があると見なす警告のサブセットのみを有効にします。基本的に、これは単なるデフォルトの警告セットです。-Weverythingコンパイラが提供するすべての警告を文字通り有効にします。

コンパイラのドキュメントを読んで有効にする警告を選択する警告に「追加」戦略を使用するのではなく、フラグ-Weverythingのリストと組み合わせて「減算」戦略を使用するのが好きです。-Wno-*このようにして、新しい警告が自動的に使用されます。無効にした警告を定期的に再評価することを忘れないでください。これにより、以前は役に立たなかった警告が改善された場合に、改善が見られ、それを使用できるようになります。

于 2013-05-22T19:35:21.173 に答える
2

あなたは何をしたでしょうか? それらが私のソースファイルである場合は修正し、開発に影響や関心がない外部コードである場合は無視します。

これはどれほど重要ですか? それはあなたの優先順位に依存します...しかし、それらを修正しなくても、おそらくコードが実行されなくなることはありません。ただし、これは悪い習慣であり、将来、より重要な警告を見逃す可能性があります。警告が多ければ多いほど、また警告のあるファイルの開発が活発であるほど、それらをクリーンアップすることがより便利になります。それらを修正しない正当な理由がある場合 (サード パーティのコードのように...「作業が多すぎる」こと自体は正当な理由ではありません)、関連するコードを警告を含むサブプロジェクトに移動します。警告なしで自分の仕事に集中できること。

それらを修正しない場合、これらの警告を削除する方法はありますか? コンパイラをダウングレードするとうまくいくようです。

于 2013-05-22T18:17:18.333 に答える
1

オプションでのみmakeコンパイルするために使用できます。そのファイルからの警告を本当に気にしない場合は、使用します(これは小文字の w であることに注意してください)。 glew.c-Wno-attributes-w

非常に単純なメイクファイルが続きます。各コマンド ラインは水平タブ\t#始まり、コメントで始まることに注意してください。

# "make" または "make all" で呼び出す
all : main.o other.o glew.o  
    g++ -o projectName main.o other.o glew.o -pedantic -Wall -Wextra -Werror

main.o : main.c other.h glew.h
    g++ -c main.c -pedantic -Wall -Wextra -Werror

other.o : other.c その他.h
    g++ -c other.c -pedantic -Wall -Wextra -Werror

glew.o : glew.c glew.h
    g++ -c glew.c -Wall -Wno-attributes
    # または、次のいずれかのようなものが必要になる場合があります。
    # g++ -c glew.c -Wno-attributes
    # g++ -c glew.c -w

# "make clean" を使用して、実行可能ファイルと中間ファイルを削除します
掃除 :
    rm プロジェクト名 *.o

できることは他にもたくさんあります (マニュアルを参照してmakeください)。Makefile を自動的に作成するツールもあります。

于 2013-05-23T16:54:55.087 に答える