有没有办法在 C++ 中使用 64 位枚举?在重构一些代码时,我遇到了一堆#defines,它们作为枚举会更好,但大于 32 位会导致编译器出错。
出于某种原因,我认为以下方法可能有效:
enum MY_ENUM : unsigned __int64
{
LARGE_VALUE = 0x1000000000000000,
};
我认为 C++98 不可能。枚举的底层表示由编译器决定。在这种情况下,您最好使用:
const __int64 LARGE_VALUE = 0x1000000000000000L;
从 C++11 开始,可以使用枚举类来指定枚举的基本类型:
enum class MY_ENUM : unsigned __int64 {
LARGE_VALUE = 0x1000000000000000ULL
};
此外,枚举类引入了一个新的名称范围。因此,不要引用LARGE_VALUE
,而是引用MY_ENUM::LARGE_VALUE
。
C++11 支持这一点,使用以下语法:
enum class Enum2 : __int64 {Val1, Val2, val3};
答案是指__int64
错过的问题。枚举在所有具有真正 64 位整数类型的 C++ 编译器中有效,即任何 C++11 编译器或具有适当扩展的 C++03 编译器。对 C++03 的扩展__int64
在编译器中的工作方式不同,包括它作为枚举的基本类型的适用性。
如果编译器不通过编译标志或任何其他方式支持 64 位枚举,我认为没有解决方案。
您可以在示例中创建类似的内容,例如:
namespace MyNamespace {
const uint64 LARGE_VALUE = 0x1000000000000000;
};
并像使用枚举一样使用它
MyNamespace::LARGE_VALUE
或者
using MyNamespace;
....
val = LARGE_VALUE;
由于您使用 C++,另一种选择可能是
const __int64 LARVE_VALUE = ...
这可以在 H 文件中指定。
您的代码片段不是 C++ 标准:
枚举 MY_ENUM : 无符号 __int64
没有意义。
正如 Torlack 建议的那样,改用 const __int64
枚举类型通常由第一个枚举初始值设定项的数据类型确定。如果该值应超出该整数数据类型的范围,则 c++ 编译器将确保它适合使用更大的整数数据类型。如果编译器发现它不属于任何整数数据类型,则编译器将抛出错误。参考:http
://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf编辑:但这完全取决于机器架构
C++ 中的枚举可以是任何整数类型。例如,您可以有一个字符枚举。IE:
enum MY_ENUM
{
CHAR_VALUE = 'c',
};
我假设这包括 __int64。试一试
enum MY_ENUM
{
LARGE_VALUE = 0x1000000000000000,
};
根据我的评论者,sixlettervariables 的说法,在 C 中,基本类型将始终是 int,而在 C++ 中,基本类型是大到足以容纳最大包含值的任何内容。所以上面的两个枚举都应该工作。
在 MSVC++ 中,您可以这样做:
枚举 MYLONGLONGENUM:__int64 { BIG_KEY=0x3034303232303330, ... };