Visual Studio编译器似乎没有在签名/未签名的分配上发出警告,仅在比较时发出警告。例如,下面的代码将在if语句中生成警告,但不会在初始分配上生成警告。
有没有让它抓住这些?我已经在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 :(得分:6)
您需要启用警告4365来捕捉作业。
这可能很棘手 - 您需要启用所有警告 - 使用/ Wall可以发出大量警告,因此您可能在查看警告时遇到一些麻烦,但确实如此。
答案 1 :(得分:2)
您可以使用/ W [level] [code]更改任何特定警告的级别。所以在这种情况下/ W34365会将警告4365变为3级警告。如果您经常这样做,您可能会发现将这些选项放在文本文件中并使用@ [file]选项来简化命令行很有用。
答案 2 :(得分:0)
@quamrana:
除了/ Wall选项之外必须有一些东西可以启用警告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选项才会出现这种情况)。