4

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
4

3 回答 3

6

您需要启用警告 4365 才能捕获分配。

这可能很棘手 - 您需要启用所有警告 - 使用 /Wall 启用大量警告,因此您可能无法看到警告发生,但确实如此。

于 2008-09-16T18:43:13.037 回答
3

您可以使用 /W[level][code] 更改任何特定警告的级别。因此在这种情况下,/W34365 会将警告 4365 变为 3 级警告。如果您经常这样做,您可能会发现将这些选项放在文本文件中并使用 @[file] 选项来简化命令行很有用。

于 2011-02-03T07:09:37.070 回答
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 选项会发生这种情况)。

于 2008-09-16T18:57:40.787 回答