19

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

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

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

10 回答 10

18

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

const __int64 LARGE_VALUE = 0x1000000000000000L;

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

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

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

于 2008-09-16T20:32:14.020 回答
18

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

enum class Enum2 : __int64 {Val1, Val2, val3};
于 2008-09-16T20:56:40.843 回答
6

所谓的C++0x的当前草案,即n30927.2 Enumeration declarations第 6 段中说:

使用哪种整数类型作为基础类型由实现定义,除非基础类型不得大于 int,除非枚举数的值不能适合 int 或 unsigned int。

同一段还说:

如果没有整数类型可以表示所有枚举数值,则枚举格式错误。

除非枚举器的 值不能适合 int 或 unsigned int执行。

例如:

enum MyEnum
{
    Undefined = 0xffffffffffffffffULL
};
于 2010-04-13T15:27:59.450 回答
4

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

于 2008-09-17T09:42:45.010 回答
2

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

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

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

并像使用枚举一样使用它

MyNamespace::LARGE_VALUE 

或者

using MyNamespace;
....
val = LARGE_VALUE;
于 2008-09-16T20:37:58.937 回答
1

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

const __int64 LARVE_VALUE = ...

这可以在 H 文件中指定。

于 2008-09-16T20:34:00.150 回答
1

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

枚举 MY_ENUM : 无符号 __int64

没有意义。

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

于 2008-09-16T20:38:00.763 回答
1

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

于 2012-12-07T02:05:00.500 回答
0

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

enum MY_ENUM
{
   CHAR_VALUE = 'c',
};

假设这包括 __int64。试一试

enum MY_ENUM
{
   LARGE_VALUE = 0x1000000000000000,
};

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

于 2008-09-16T20:30:32.077 回答
0

在 MSVC++ 中,您可以这样做:

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

于 2009-09-24T09:05:10.857 回答