2008-09-16 10 views
3

Visual Studioコンパイラは、署名された/割り当てられていない割り当てでは警告のようには見えません。たとえば、以下のコードでは、ifステートメントでは初期アサインメントではなく警告が生成されます。VSコンパイラは符号付き/符号なし割り当てをキャッチしますか?

これをキャッチするにはどうしてですか?私はすでにW4にいますが、別の場所があるかもしれないと思っていました。

おかげで、

int foo(void) 
{ 
    unsigned int fooUnsigned = 0xffffffff; 
    int fooSigned = fooUnsigned; // no warning 

    if (fooSigned < fooUnsigned) // warning 
    { 
     return 0; 
    } 

    return fooSigned; 
} 

更新:

Quamranaが、これはさえW4で、デフォルトでオフであるように思われる4365の警告によって制御され、権利です。ただし、指定された警告レベルで明示的に有効にすることができます。

#pragma warning (4 : 4365) 

です。

warning C4365: 'initializing' : conversion from 'unsigned int' to 'int', signed/unsigned mismatch 
+0

警告をオンにする#pragmaがあることはわかりませんでした。 #pragmaの問題は、警告が必要なすべてのモジュールで繰り返す必要があることです。 – quamrana

答えて

6

割り当てをキャッチするには、警告4365を有効にする必要があります。

これは難しいかもしれません - すべての警告を有効にする必要があります - 壁を使用すると多くの警告が行われるため、警告が表示されるのを見るのに何らかの問題が発生する可能性があります。

+0

#pragma warning(デフォルト:4365)を使用して有効にすることもできます。 – ChrisN

0

@quamrana:警告4365を有効にする/ウォールオプションを超えた何かがあるに違いありません

C:\Temp>cl /Wall /c foo.c 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

foo.c 
foo.c(6) : warning C4018: '<' : signed/unsigned mismatch 

私はアンドリューはそれが動作するようになったことがわかり、それはありません、なぜ誰もがアイデアを持っていませんここで働いている?

Visual Studioのドキュメントによれば、C4365の警告を出すために、ドキュメントのサンプルプログラムを入手することすらできません(関連するC4245警告が表示されますが、これは/ W4オプションとにかく)。

2

/W [レベル] [コード]を使用して、特定の警告レベルを変更できます。この場合、/ W34365は警告4365をレベル3の警告にします。これを多く行うと、これらのオプションをテキストファイルに入れて@ [file]オプションを使用してコマンドラインを単純化すると便利です。

+0

/wは小文字でなければなりません。 –

関連する問題