10

重複の可能性:
g ++ -double->intcastについて警告しません

ここでの質問によると、double/floatから符号なし整数への直接変換は移植できません。コードにこれが発生するケースがいくつかあることがわかりました。これが発生した場合に警告するようにg++に指示したいのですが、そのようなオプションが見つかりません。これを行うオプションがあるかどうか誰かが知っていますか?

注:-Wconversionは表示されますが、それは私が気にしない他のすべての種類の変換についても警告します(intをunsigned intに変換するなど、標準に従って移植可能です)。

編集:これが私が警告を見たいコード例です:

double dblNumber = -234;
unsigned long uintNumber = dblNumber;

g ++の1つのバージョンでは、これにより0xFFFFFF16の整数値(2の補数では-234)が得られます。別の場合、それは私に0を与えます。明らかにコードが曖昧であるため、当然のことながら移植性があるとは見なされません。

4

2 に答える 2

4

使用したくないとおっしゃっていたのは知っています-Wconversionが、気になる問題について警告します。少なくともg ++ 4.5では、 (たとえば)に変換longしても警告しません。unsigned long法的に望ましい変換を実行している場所に警告が表示されるその他の場合は、キャストするだけです。将来のメンテナは、コードコンテキストから意図的なものかどうかを推測するのではなく、既知の変換が行われていることを明示的に明確にしてくれてありがとうございます。

于 2012-12-06T21:28:20.367 に答える
1

floatからintへの暗黙的な変換が行われ、切り捨てられた値が宛先タイプに適合しない場合、例がうまく示しているように、動作は未定義です。

g ++によって提供される唯一のツールが-Wconversionである場合、おそらくあなたはあなたの都合に合わせて警告をフィルターで取り除くためにあなた自身のツールを作るべきです(私は通常のsedawkperlまたはphpを考えていますが、それはこれらのツールの可用性に依存しますシステム上で、IDEを使用している場合は、IDEから直接同様のことを実行できる可能性があります)。

gccの特定のプラグマディレクティブを使用して、変換チェックを特定のファイル、または特定のコード部分に制限することもできます。

問題のある変換が発生するコードを特定するために使用される他のプログラムによる方法は、明示的なキャストを挿入するために確実に使用できます。これは、目指すべき目標です。

于 2012-12-06T21:47:02.607 に答える