LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1645|回复: 10

enum 自动定义宏?

[复制链接]
发表于 2009-5-3 16:11:08 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include <stdlib.h>
typedef enum
{
  CHAMPLAIN_MAP_SOURCE_DEBUG,
  CHAMPLAIN_MAP_SOURCE_OPENSTREETMAP,
  CHAMPLAIN_MAP_SOURCE_OPENARIALMAP,
  CHAMPLAIN_MAP_SOURCE_MAPSFORFREE_RELIEF,
  CHAMPLAIN_MAP_SOURCE_COUNT
} ChamplainMapSource;

int main ()
{
ChamplainMapSource i=CHAMPLAIN_MAP_SOURCE_COUNT;
printf ("%x\n",CHAMPLAIN_MAP_SOURCE_OPENARIALMAP);
return 0;
}

结果是2 .......
发表于 2009-5-4 10:03:22 | 显示全部楼层
2是正确的啊。
typedef enum
{
CHAMPLAIN_MAP_SOURCE_DEBUG,                                            0
CHAMPLAIN_MAP_SOURCE_OPENSTREETMAP,                            1
CHAMPLAIN_MAP_SOURCE_OPENARIALMAP,                               2
CHAMPLAIN_MAP_SOURCE_MAPSFORFREE_RELIEF,                    3
CHAMPLAIN_MAP_SOURCE_COUNT                                             4
} ChamplainMapSource;

printf那里打印的是CHAMPLAIN_MAP_SOURCE_OPENARIALMAP,并不是打印变量“i”,而且输出结果是16进制的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-4 13:40:07 | 显示全部楼层
???

关键是CHAMPLAIN_MAP_SOURCE_OPENARIALMAP没定义啊。
没有
#define CHAMPLAIN_MAP_SOURCE_OPENARIALMAP 2
之类的

enum自己扩充的定义??

再书里没见过。不过代码里很常见。想弄个明白
回复 支持 反对

使用道具 举报

发表于 2009-5-4 14:55:41 | 显示全部楼层
enum 里定义的变量就相当于const变量,其只能用不能改,但是和define宏定义有点不同,define宏定义可以取消(#undef),但变量却不能取消
回复 支持 反对

使用道具 举报

发表于 2009-5-4 16:15:44 | 显示全部楼层
你可以将enum当成一个整型数组来看,enum的第一项值为0,然后后面每项依次加1,当然初值0是可以改变的。
typedef enum
{
CHAMPLAIN_MAP_SOURCE_DEBUG = 5,
CHAMPLAIN_MAP_SOURCE_OPENSTREETMAP,
CHAMPLAIN_MAP_SOURCE_OPENARIALMAP,
CHAMPLAIN_MAP_SOURCE_MAPSFORFREE_RELIEF,
CHAMPLAIN_MAP_SOURCE_COUNT
} ChamplainMapSource;

像上面那样声明的话,再编译执行程序会输出7
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-4 16:54:53 | 显示全部楼层
网络延时发重了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-4 16:56:49 | 显示全部楼层

受教了。

受教了。
是不是默认成这样子:


const int CHAMPLAIN_MAP_SOURCE_DEBUG = 0;
const int CHAMPLAIN_MAP_SOURCE_OPENSTREETMAP=1;
const int CHAMPLAIN_MAP_SOURCE_OPENARIALMAP=2;
const int CHAMPLAIN_MAP_SOURCE_MAPSFORFREE_RELIEF=3;
const int CHAMPLAIN_MAP_SOURCE_COUNT=4;
使用5块内存

重复使用一块内存:
typedef enum
{
CHAMPLAIN_MAP_SOURCE_DEBUG,
CHAMPLAIN_MAP_SOURCE_OPENSTREETMAP,
CHAMPLAIN_MAP_SOURCE_OPENARIALMAP,
CHAMPLAIN_MAP_SOURCE_MAPSFORFREE_RELIEF,
CHAMPLAIN_MAP_SOURCE_COUNT
} ChamplainMapSource;

声明的enum类型使用一个int,但元素使用了5个int。

这样理解对么?
回复 支持 反对

使用道具 举报

发表于 2009-5-4 17:43:34 | 显示全部楼层
你当成一个数组就明白了
typedef enum
{
CHAMPLAIN_MAP_SOURCE_DEBUG,
CHAMPLAIN_MAP_SOURCE_OPENSTREETMAP,
CHAMPLAIN_MAP_SOURCE_OPENARIALMAP,
CHAMPLAIN_MAP_SOURCE_MAPSFORFREE_RELIEF,
CHAMPLAIN_MAP_SOURCE_COUNT
} ChamplainMapSource;
相当于
int ChamplainMapSource[] = { 0, 1, 2, 3, 4 };
enum的元素
CHAMPLAIN_MAP_SOURCE_DEBUG,
CHAMPLAIN_MAP_SOURCE_OPENSTREETMAP,
CHAMPLAIN_MAP_SOURCE_OPENARIALMAP,
CHAMPLAIN_MAP_SOURCE_MAPSFORFREE_RELIEF,
CHAMPLAIN_MAP_SOURCE_COUNT
分别指向ChamplainMapSource数组的第1-5个元素,CHAMPLAIN_MAP_SOURCE_OPENARIALMAP会打印出2,因为其指向了数组的每3个元素,而其内容是2所以打印出来的值为2。

先暂时当成数组来理解吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-4 19:19:54 | 显示全部楼层
可书里说了:enum类型是共用一块内存的.

难道enum里存的是指针????
回复 支持 反对

使用道具 举报

发表于 2009-6-29 23:37:01 | 显示全部楼层
应该是union共用一块内存吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表