有没有办法在C ++中使用64位枚举?虽然重构了一些代码,但我遇到了一堆#defines,它们作为枚举会更好,但是大于32位会导致编译器出错。
出于某种原因,我认为以下内容可能有效:
enum MY_ENUM : unsigned __int64
{
LARGE_VALUE = 0x1000000000000000,
};
答案 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,...};