2010-10-21 89 views
2

我使用gcc,它在我有的体系结构(一般不知道)上实现枚举为32位整数。如果我尝试分配一个枚举值过大时,我得到枚举与64位底层整数

warning: integer overflow in expression

有没有办法让GCC使用64位整数作为底层的整数类型? gcc的具体方法很好,但如果有便捷的方式,那就更好了。

**编辑** 这是一个相关的帖子:64 bit enum in C++?

不像这个问题,我也有兴趣在GNU扩展。

回答

1

以下作品我-std=c++0x,而与-std=c++98虽然

enum EnumFoo { 
    FooSomething = 0x123456789ULL 
}; 

我测试了这个与

$ g++ --version 
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3 
+0

您使用的是哪个版本的gcc?这似乎不适用于4.3.4,我仍然得到一个32位枚举。 – 2010-10-21 19:15:05

+0

@pythonic隐喻:更新我的答案来解决您的问题。 – Arun 2010-10-21 19:57:18

+0

'ULL'应该告诉你的编译器使用C99的'unsigned long long'类型,它的最小宽度为64位(在我意识到的所有实现中定义为正好64位)。但是,如果你的编译器不支持'long long'(例如,如果你使用GCC并使用* strict * C++ 98,这就是'-std = C++ 98'的意思),'ULL'将会是看作是一个错误,或者额外的'L'将被忽略,并且你将得到一个'unsigned long'(它通常是32位宽)。我不记得准确的哪种行为符合标准,但如果它是给你32位,我怀疑后者。 – 2010-10-21 19:57:49

0

一个选项:使用特定类型的static const成员创建模板类。

例如std::tr1::integral_constant,在GNU发行版(至少是我使用的那个)中用C++/tr1/type_traits声明。

一个枚举值:你的声明可能物质(例如,使用UL如适用)