【问题标题】:Why Is C++ Issuing Warnings On Enums With Negative Values?为什么 C++ 对具有负值的枚举发出警告?
【发布时间】:2010-11-04 04:37:24
【问题描述】:

我当前的代码类似于:

enum Enum1 : signed __int8
{
    Value1 = 1 ,
    Value2 = 2 ,
    Value3 = -3  // C4341
} ;

错误详情状态:
“警告 C4341:‘Value3’:有符号值超出枚举常量的范围”

MSDN 指出只有当您使用超出 int 范围的值时才会出现此警告:
(> 2^31) 或 (

为什么它告诉我我的负值无效?这只是一个警告,但谷歌告诉我这个警告表明这些枚举值将是未定义的——这会破坏我的程序。

【问题讨论】:

  • 如果你用十六进制定义它会抱怨吗? (signed __int8)-3 == hex 0xFD == dec 253 (如果你的机器无论如何都是二进制补码......)
  • @JimR 发出错误,指出 0xFD 是分配给有符号变量的无符号值。
  • @Giffyguy:尝试使用 char 而不是 __int8。我很好奇你是否收到警告(它们在 VS 中应该是相同的)。
  • @Jason char(和 signed char)产生相同的结果:C4341 表示 -3 和 C4369 表示 0xFD
  • @Giffyguy:好吧,我在 gcc4.4 及更高版本中没有收到警告,所以我很茫然。也许微软搞砸了 C++0x 的实现?

标签: c++ visual-c++ enums warnings compiler-warnings


【解决方案1】:

对我来说似乎是一个错误。当前的 0x 草案并未表明应该如此,MSDN documentation 也没有。

【讨论】:

    【解决方案2】:

    你的答案基本上描述在这里:Are C++ enums signed or unsigned?

    由编译器的实现来定义枚举的值是有符号还是无符号。我假设他们将警告留在那里,因此如果您或其他人使用不同的编译器,您可能会得到不同的行为。

    【讨论】:

    • 我认为添加 ":signed __int8" 指定了编译器将使用的底层类型......这个符号特定于 Visual Studio,我认为任何编译器特定的实现都不会覆盖它。
    • 看起来他正在使用新的 c++0x 语法,所以我认为微软应该允许你这样做。我很好奇如果他使用 char 而不是 __int8,它是否会显示警告。 (PS。不是VS特有的,gcc也有)
    • @JasonIverson 是的,char 甚至 signed char 都会发出警告
    【解决方案3】:

    我正在使用 Microsoft Visual Studio 2010。使用“char”或“signed char”代替“signed __int8”会产生相同的结果 - 即 C4341 用于“-3”,C4369 用于 0xFD
    This other MSDN article 明确说明":signed __int8" 明确指定枚举数的基础类型。话虽如此,可以假设此警告的存在只是为了让开发人员意识到可能与其他编译器不兼容。

    【讨论】:

      【解决方案4】:

      由于有人提到它是特定于编译器的,它可以与 g++ 一起使用,如下所示

      #include <stdio.h>
      
      enum Enum1
      {
          Value1 = 1 ,
          Value2 = 2 ,
          Value3 = -3
      } ;
      
      enum Enum1 myval;
      
      
      main(){
          myval = Value3;
          printf("%d\n", myval);
      }
      

      编译:g++ negenum.cpp

      运行时的结果: -3

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-24
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 2020-01-30
        • 1970-01-01
        相关资源
        最近更新 更多