2008-09-16 51 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是正確的,這是由警告4365這似乎在默認情況下處於關閉狀態,甚至在W4控制。但是,您可以像這樣明確地爲其給定的警告級別啓用它;

#pragma warning (4 : 4365) 

其中導致;

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

我沒有意識到有一個#pragma來打開警告。 #pragma的問題在於需要在需要警告的每個模塊中重複該問題。 – quamrana 2008-09-16 21:52:55

回答

6

您需要啓用警告4365才能完成作業。

這可能會非常棘手 - 您需要啓用所有警告 - 使用/ Wall可啓用許多警告,因此您可能在查看警告時發生問題,但確實如此。

+0

您也可以使用#pragma warning(默認值:4365)啓用。 – ChrisN 2008-09-16 18:56:06

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 [level] [code]更改任何特定警告的級別。所以在這種情況下/ W34365將會發出警告4365進入3級警告。如果你這樣做了很多,你可能會發現將這些選項放在一個文本文件中並使用@ [file]選項來簡化命令行很有用。

+0

/w必須小寫。 – 2015-02-27 20:10:06