C ++中的64位枚举?

时间:2008-09-16 20:28:33

标签: c++ enums 64-bit

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

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

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

10 个答案:

答案 0 :(得分:17)

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

const __int64 LARGE_VALUE = 0x1000000000000000L;

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

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

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

答案 1 :(得分:17)

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

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

答案 2 :(得分:5)

当前的所谓C++0x草案,n3092 7.2枚举声明中说明,第6段:

  

它是实现定义的   整数类型用作   基础类型除了   基础类型不应该更大   比int除非a的值   枚举器不能适合int或   unsigned int。

同一段也说:

  

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

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

例如:

enum MyEnum
{
    Undefined = 0xffffffffffffffffULL
};

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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

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

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

使用它就像使用

的枚举一样
MyNamespace::LARGE_VALUE 

using MyNamespace;
....
val = LARGE_VALUE;

答案 5 :(得分:1)

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

const __int64 LARVE_VALUE = ...

这可以在H文件中指定。

答案 6 :(得分:1)

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

  

枚举MY_ENUM:无符号__int64

没有意义。

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

答案 7 :(得分:1)

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

答案 8 :(得分:0)

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

enum MY_ENUM
{
   CHAR_VALUE = 'c',
};

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

enum MY_ENUM
{
   LARGE_VALUE = 0x1000000000000000,
};

根据我的评论者,六个变量,在C中,基类型将始终是int,而在C ++中,基类型是足够大以适应最大包含值的任何值。所以上面的两个枚举都应该有用。

答案 9 :(得分:0)

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

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