C中关键字enum--枚举--精巧的用法

基础普及:

枚举在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即枚举类型 常量元素的总数。

以上。。。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值