C ++中的64位枚举?
有没有一种方法可以在C ++中使用64位枚举?在重构某些代码时,我遇到了#define串,这最好作为枚举,但大于32位会导致编译器出错。
由于某些原因,我认为以下方法可能会起作用:
enum MY_ENUM : unsigned __int64 { LARGE_VALUE = 0x1000000000000000, };
解决方案
回答
C ++中的枚举可以是任何整数类型。例如,我们可以有一个char枚举。 IE:
enum MY_ENUM { CHAR_VALUE = 'c', };
我认为这包括__int64. 尝试一下
enum MY_ENUM { LARGE_VALUE = 0x1000000000000000, };
根据我的评论者,hexalettervariables,在C中,基本类型将始终为int,而在C ++中,基本类型的大小足以容纳最大的包含值。因此,上面的两个枚举都应该起作用。
回答
我认为C ++ 98不可能做到这一点。枚举的基本表示形式取决于编译器。在这种情况下,最好使用:
const __int64 LARGE_VALUE = 0x1000000000000000L;
从C ++ 11开始,可以使用枚举类指定枚举的基本类型:
enum class MY_ENUM : unsigned __int64 { LARGE_VALUE = 0x1000000000000000ULL };
此外,枚举类引入了新的名称范围。因此,我们将引用MY_ENUM :: LARGE_VALUE而不是引用" LARGE_VALUE"。
回答
由于我们使用的是C ++,因此另一种替代方法可能是
const __int64 LARVE_VALUE = ...
可以在H文件中指定。
回答
如果编译器不支持通过编译标志或者任何其他方式支持64位枚举,则我认为对此没有解决方案。
我们可以在示例中创建类似以下内容的东西:
namespace MyNamespace { const uint64 LARGE_VALUE = 0x1000000000000000; };
并像使用枚举一样使用它
MyNamespace::LARGE_VALUE
或者
using MyNamespace; .... val = LARGE_VALUE;
回答
代码片段不是c ++标准:
enum MY_ENUM : unsigned __int64
没有道理。
改用const __int64,就像Torlack所建议的那样
回答
C ++ 11使用以下语法支持此功能:
enum class Enum2 : __int64 {Val1, Val2, val3};
回答
引用__int64的答案遗漏了该问题。该枚举在具有真正的64位整数类型的所有C ++编译器(即任何C ++ 11编译器或者具有适当扩展名的C ++ 03编译器)中均有效。对C ++ 03的扩展,例如__int64在各个编译器中的工作方式有所不同,包括它是否适合作为枚举的基本类型。
回答
在MSVC ++中,我们可以执行以下操作:
枚举MYLONGLONGENUM:__ int64 {BIG_KEY = 0x3034303232303330,...};
回答
所谓的C ++ 0x的当前草案是n3092在7.2枚举声明的第6段中说的:
It is implementation-defined which integral type is used as the underlying type except that the underlying type shall not be larger than int unless the value of an enumerator cannot fit in an int or unsigned int.
同一段还说:
If no integral type can represent all the enumerator values, the enumeration is ill-formed.
我对该部分的解释是除非枚举器的值不能适合int或者unsigned int,否则只要在特定C ++中提供64位整数类型,用64位整数值初始化枚举器是完全有效和安全的执行。
例如:
enum MyEnum { Undefined = 0xffffffffffffffffULL };