【问题标题】:64 bit enum in C++?C ++中的64位枚举?
【发布时间】:2008-09-16 20:28:33
【问题描述】:

有没有办法在 C++ 中使用 64 位枚举?在重构一些代码时,我遇到了一堆 #defines,它们作为枚举会更好,但大于 32 位会导致编译器出错。

出于某种原因,我认为以下方法可能有效:

enum MY_ENUM : unsigned __int64  
{  
    LARGE_VALUE = 0x1000000000000000,  
};

【问题讨论】:

  • 有理由更喜欢unsigned __int64 而不是uint64_t?我认为uint64_t 是为几乎所有相关平台定义的,但unsigned __int64 听起来像是一个平台(硬件、编译器甚至库)特定的定义。
  • @Johan __int64long long 的 Microsoft-C++ 特定别名。

标签: c++ enums 64-bit


【解决方案1】:

我认为这在 C++98 中是不可能的。枚举的底层表示由编译器决定。在这种情况下,您最好使用:

const __int64 LARGE_VALUE = 0x1000000000000000L;

从 C++11 开始,可以使用枚举类来指定枚举的基本类型:

enum class MY_ENUM : unsigned __int64 {
    LARGE_VALUE = 0x1000000000000000ULL
};

此外,枚举类引入了一个新的名称范围。所以不要引用LARGE_VALUE,而是引用MY_ENUM::LARGE_VALUE

【讨论】:

  • 这就是我最终采用的方法,但我很好奇 64 位枚举是否可能,即使使用编译器特定的扩展。
  • MSVC 8 (2005) 已经支持底层类型作为非标准扩展。
【解决方案2】:

C++11 支持这一点,使用以下语法:

enum class Enum2 : __int64 {Val1, Val2, val3};

【讨论】:

  • 那时我很接近。我必须在某处阅读: type 语法。
  • 请注意,class 仍然是可选的。如果你想要老式的枚举,但需要自定义类型,你也可以enum moo : long long {...}
【解决方案3】:

所谓C++0x的当前草案,它是n30927.2枚举声明第6段中说:

这是实现定义的 整数类型被用作 基础类型,除了 底层类型不应更大 比 int 除非值 枚举数不能放入 int 或 无符号整数。

同一段还说:

如果没有整数类型可以代表所有 枚举器值,枚举 格式不正确。

我对 除非枚举器的值不能放入 int 或 unsigned int 部分的解释是,使用 64 位整数值初始化枚举器是完全有效和安全的,只要存在特定 C++ 实现中提供的 64 位整数类型。

例如:

enum MyEnum
{
    Undefined = 0xffffffffffffffffULL
};

【讨论】:

  • 如果你不想计算你的 f,你可以这样做 Undefined = ~0x0ULL
【解决方案4】:

参考__int64的答案错过了这个问题。枚举 在所有具有真正 64 位整数类型的 C++ 编译器中有效,即任何 C++11 编译器或具有适当扩展的 C++03 编译器。像__int64 这样的 C++03 扩展在编译器中的工作方式不同,包括它作为枚举基类型的适用性。

【讨论】:

    【解决方案5】:

    如果编译器通过编译标志或任何其他方式不支持 64 位枚举,我认为没有解决方案。

    您可以在示例中创建类似的内容:

    namespace MyNamespace {
    const uint64 LARGE_VALUE = 0x1000000000000000;
    };
    

    并像使用枚举一样使用它

    MyNamespace::LARGE_VALUE 
    

    using MyNamespace;
    ....
    val = LARGE_VALUE;
    

    【讨论】:

    • 不过,类型安全松散。
    • 我们谈话的速度让我想起了通信象棋:D
    【解决方案6】:

    由于您使用 C++ 工作,因此另一种选择可能是

    const __int64 LARVE_VALUE = ...
    

    这可以在 H 文件中指定。

    【讨论】:

    • 我第一次骗了 9 个字符。
    【解决方案7】:

    您的代码片段不是 c++ 标准:

    枚举 MY_ENUM : 无符号 __int64

    没有意义。

    使用 const __int64,正如 Torlack 建议的那样

    【讨论】:

    • 他已经在另一种花括号语言(例如 C# 支持它)或即将允许的 C++ 标准中看到它。
    【解决方案8】:

    枚举类型通常由第一个枚举初始化器的数据类型决定。如果该值应超出该整数数据类型的范围,则 c++ 编译器将确保它适合使用更大的整数数据类型。如果编译器发现它不属于任何整数数据类型,则编译器将抛出错误。 参考:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
    编辑:但这完全取决于机器架构

    【讨论】:

      【解决方案9】:

      C++ 中的枚举可以是任何整数类型。例如,您可以有一个字符枚举。即:

      enum MY_ENUM
      {
         CHAR_VALUE = 'c',
      };
      

      我会假设这包括 __int64。试试吧

      enum MY_ENUM
      {
         LARGE_VALUE = 0x1000000000000000,
      };
      

      根据我的评论者,sixlettervariables,在 C 中,基本类型将始终是 int,而在 C++ 中,基本类型是大到足以容纳最大包含值的任何内容。所以上面的两个枚举都应该工作。

      【讨论】:

      • @Doug T.:虽然 ANSI C 规定枚举是“int”数据类型的大小,但 ISO C++ 规定枚举的大小至少与表示所有值所需的大小一样大。
      【解决方案10】:

      在 MSVC++ 中你可以这样做:

      枚举 MYLONGLONGENUM:__int64 { BIG_KEY=0x3034303232303330, ... };

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-06
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 2010-11-26
        • 1970-01-01
        相关资源
        最近更新 更多