【问题标题】:Make VS compiler catch signed/unsigned assignments?让 VS 编译器捕获有符号/无符号的赋值?
【发布时间】:2010-09-09 16:14:31
【问题描述】:

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

【问题讨论】:

  • 我没有意识到有一个#pragma 可以打开警告。 #pragma 的问题在于它需要在您想要警告的每个模块中重复。

标签: c++ c visual-studio


【解决方案1】:

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

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

【讨论】:

  • 你也可以使用#pragma warning(default: 4365)来启用。
  • 使用编译指示似乎是最好的。这对我有用,即使它在默认级别被禁用:#pragma warning(error : 4365)
【解决方案2】:

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

【讨论】:

  • /w 必须小写。
【解决方案3】:

@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

我看到 Andrew 让它工作了,但有人知道为什么它在这里不起作用吗?

Visual Studio 文档表明应该这样做,但我什至无法在文档中获取示例程序来给出 C4365 警告(尽管它确实给出了相关的 C4245 警告 - 但无论如何只使用 /W4 选项就会发生这种情况)。

【讨论】:

    猜你喜欢
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2021-07-30
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多