Chinaunix首页 | 论坛 | 博客
  • 博客访问: 830125
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

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,所以它可以前置声明。

阅读(974) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~