在C++中,是否有一种方式可以使用64位枚举?当我重构代码时,我发现一堆#定义最好改为枚举,但是超过32位会导致编译器报错。
出于某种原因,我认为以下方法可能有效:
enum MY_ENUM : unsigned __int64
{
LARGE_VALUE = 0x1000000000000000,
};
我认为使用C++98无法实现这一点。枚举类型的底层表示取决于编译器。在这种情况下,最好使用:
const __int64 LARGE_VALUE = 0x1000000000000000L;
自 C++11 开始,可以使用枚举类(enum classes)来指定枚举的基础类型:
enum class MY_ENUM : unsigned __int64 {
LARGE_VALUE = 0x1000000000000000ULL
};
此外,枚举类引入了新的名称空间。所以,您不再引用LARGE_VALUE
,而是应该引用MY_ENUM::LARGE_VALUE
。
C++11支持这一特性,使用以下语法:
enum class Enum2 : __int64 {Val1, Val2, val3};
: type
语法。 - RobUndefined = ~0x0ULL
。 - Cory-G有关__int64
的答案忽略了问题。枚举类型在所有具有真正的64位整数类型的C++编译器中都是有效的,即任何C++11编译器或具有适当扩展的C++03编译器。C++03的扩展,如__int64
在不同的编译器中有不同的工作方式,包括其作为枚举类型基础类型的适用性。
namespace MyNamespace {
const uint64 LARGE_VALUE = 0x1000000000000000;
};
并且可以像使用枚举一样使用它
MyNamespace::LARGE_VALUE
using MyNamespace;
....
val = LARGE_VALUE;
枚举类型通常由第一个枚举初始化器的数据类型确定。如果该值超出了整数数据类型的范围,则C++编译器将使用更大的整数数据类型来确保它适合其中。如果编译器发现它不属于任何整数数据类型,则编译器将抛出错误。
参考:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
编辑:然而,这完全取决于机器架构。
由于您正在使用C++,另一个选择可能是
const __int64 LARVE_VALUE = ...
这可以在一个H文件中指定。
你的代码片段不符合C++标准:
枚举MY_ENUM:unsigned __int64
没有意义。
像Torlack建议的那样,使用const __int64代替。
C++中的枚举可以是任何整数类型。例如,您可以有一个字符枚举。即:
enum MY_ENUM
{
CHAR_VALUE = 'c',
};
我会认为这包括__int64。只需尝试
enum MY_ENUM
{
LARGE_VALUE = 0x1000000000000000,
};
unsigned __int64
而不是uint64_t
?我认为uint64_t
已经被定义在几乎所有相关平台上,但是unsigned __int64
听起来像是一个特定于平台(硬件、编译器或甚至库)的定义。 - Johan__int64
是 Microsoft-C++ 中对于long long
的特定别名。 - ManuelAtWork