代码之家  ›  专栏  ›  技术社区  ›  Andrew Grant

让VS编译器捕获有符号/无符号的赋值?

  •  4
  • Andrew Grant  · 技术社区  · 17 年前

    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时,警告4365似乎也是关闭的。但是,您可以明确地为给定的警告级别启用它,如下所示;

    #pragma warning (4 : 4365)
    

    其结果是:;

    warning C4365: 'initializing' : conversion from 'unsigned int' to 'int', signed/unsigned mismatch
    
    3 回复  |  直到 17 年前
        1
  •  6
  •   quamrana Ryuzaki L    17 年前

    您需要启用警告4365才能捕获该任务。

    这可能很棘手——你需要启用所有警告——使用/Wall,它启用了很多警告,所以你可能很难看到警告发生,但它确实发生了。

        2
  •  3
  •   ottibus    14 年前

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

        3
  •  0
  •   Michael Burr    17 年前

    @夸姆拉纳:

    必须有超出/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选项,就会出现这种情况)。