2012年(158)
分类: C/C++
2012-11-20 10:36:55
代码如下:
enum { a = 0xFFFFFFFFFFFFFFFFull };
cout << sizeof(a)
<< endl;
cout << hex << a << endl;
enum { b =
0x0123456789ABCDEFull };
cout << sizeof(b) << endl;
cout
<< hex << b <<
endl;
在gcc3.4.2上输出
8
ffffffffffffffff
8
123456789abcdef
在vc2005上输出
4
ffffffff
4
89abcdef
且有一个编译警告:warning
C4341: 'b' : signed value is out of range for enum constant
ISO/IEC14882(
Second edition 2003-10-15 )
7.2.1 中“The constant-expression shall be of
integral or enumeration type.”
可见 enum
的常量表达式应该是一个整型,而不必须是int类型。
(整型包括bool、signed/unsigned char、signed/unsigned
short、signed/unsigned int、signed/unsigned long、signed/unsigned long
long、enum、地址等等)
如果……,那么第 7.2.5 中还有
“……shall not be larger than int unless
the value of an enumerator cannot fit in an int or unsigned
int.”
[2006-04-06 补充]
发了一个问题,那就是vc++上enum可以前置声明,而gcc却不可以,经由其对照标准:
编译器在看到enum的完整定义之前,根本不知道sizeof(enum_type)是多少,有可能是char short
int……
因为VC++存在enum定长的bug,所以它可以前置声明。