基础普及:
枚举在C/C++/c#中,是一个被命名的整型常数的集合,枚举在日常生活中很常见。例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY, 就是一个枚举。
枚举类型的使用方法:
一般的定义方式如下:
enum enum_type_name
{
ENUM_CONST_1,
ENUM_CONST_2,
...
ENUM_CONST_n
} enum_variable_name;
注意:enum_type_name 是自定义的一种数据数据类型名,而enum_variable_name 为enum_type_name类型的一个变量,也就是我们平时常说的枚举变量。
实际上enum_type_name类型是对一个变量取值范围的限定,而花括号内是它的取值范围,即enum_type_name 类型的变量enum_variable_name 只能取值为花括号内的任何一个值,如果赋给该类型变量的值不在列表中,则会报错或者警告。ENUM_CONST_1、ENUM_CONST_2、…、ENUM_CONST_n,这些成员都是常量,也就是我们平时所说的枚举常量(常量一般用大写)。
enum 变量类型还可以给其中的常量符号赋值,如果不赋值则会从被赋初值的那个常量开始依次加1,如果都没有赋值,它们的值从0 开始依次递增1。如分别用一个常数表示不同颜色:
enum Color
{
GREEN = 1,
RED,
BLUE,
GREEN_RED = 10,
GREEN_BLUE
}ColorVal;
其中各常量名代表的数值分别为:
GREEN = 1
RED = 2
BLUE = 3
GREEN_RED = 10
GREEN_BLUE = 11
常与typedef关键字 配合使用
实例:
typedef enum {A =0, B = !A,ONE,TWO,THREE=0xffffff} enum_test;
使用:
enum_test flag_t=ONE;
直接给枚举类型生命了别名:enum_test–可以看做自定义的数据类型。
问题:sizeof(ColorVal)的值为多少?为什么?
实测:(如上实例—-32位处理器+IAR编译器)
场景一:
typedef enum {A =0, B = !A,ONE,TWO,THREE=0xffffff} enum_test;//
上图可知:sizeof(enum_test)==4
场景二:
typedef enum {A =0, B = !A,ONE,TWO,THREE=0xff} enum_test;
可知:此时sizeof(enum_test)==1
对比:sizeof(枚举)==枚举常量最大值的内存占用大小,32位处理器,最长4字节,最小1字节。
精巧的用法
最近翻看lwip源码,看到源码作者的代码,关于enum部分摘于此处。
/* Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end */
typedef enum {
#define LWIP_MEMPOOL(name,num,size,desc) MEMP_##name,
#include "lwip/memp_std.h"
MEMP_MAX
} memp_t;
实现为每个POOL定义一个名称/编号。
宏定义部分:
LWIP_MEMPOOL(XXXX,num,size,desc)<–被替换成–>MEMP_XXXX样子,
其中:##在C中被称作连接符,将两个子串无缝连接起来。
然后包含memp_std.h文件,部分内容如下:
..........
*
* A list of internal pools used by LWIP.
*
* LWIP_MEMPOOL(pool_name, number_elements, element_size, pool_description)
* creates a pool name MEMP_pool_name. description is used in stats.c
*/
#if LWIP_RAW
LWIP_MEMPOOL(RAW_PCB, MEMP_NUM_RAW_PCB, sizeof(struct raw_pcb), "RAW_PCB")
#endif /* LWIP_RAW */
#if LWIP_UDP
LWIP_MEMPOOL(UDP_PCB, MEMP_NUM_UDP_PCB, sizeof(struct udp_pcb), "UDP_PCB")
#endif /* LWIP_UDP */
#if LWIP_TCP
LWIP_MEMPOOL(TCP_PCB, MEMP_NUM_TCP_PCB, sizeof(struct tcp_pcb), "TCP_PCB")
LWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN, sizeof(struct tcp_pcb_listen), "TCP_PCB_LISTEN")
LWIP_MEMPOOL(TCP_SEG, MEMP_NUM_TCP_SEG, sizeof(struct tcp_seg), "TCP_SEG")
#endif /* LWIP_TCP */
#if IP_REASSEMBLY
LWIP_MEMPOOL(REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip_reassdata), "REASSDATA")
#endif /* IP_REASSEMBLY */
#if IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF
LWIP_MEMPOOL(FRAG_PBUF, MEMP_NUM_FRAG_PBUF, sizeof(struct pbuf_custom_ref),"FRAG_PBUF")
#endif /* IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF */
..............
编译完memp_std.h就弄出了一个枚举,如下:
typedef enum{
MEMP_RAW_PCB,
MEMP_UDP_PCB,
MEMP_TCB_PCB,
MEMP_TCB_LISTEN,
...........
MEMP_MAX
}memp_t;
MEMP_MAX即枚举类型 常量元素的总数。
以上。。。。。