C中關鍵字enum 列舉 精巧的用法

2021-07-08 13:37:08 字數 3175 閱讀 9694

列舉在c/c++/c#中,是乙個被命名的整型常數的集合,列舉在日常生活中很常見。例如表示星期的sunday, monday, tuesday, wednesday, thursday, friday,saturday, 就是乙個列舉。

列舉型別的使用方法:

一般的定義方式如下:

enum enum_type_name

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

colorval;

其中各常量名代表的數值分別為:

green = 1

red = 2

blue = 3

green_red = 10

green_blue = 11

常與typedef關鍵字 配合使用

例項:

typedef enum  enum_test;
使用:

enum_test flag_t=one;
直接給列舉型別生命了別名:enum_test–可以看做自定義的資料型別。

問題:sizeof(colorval)的值為多少?為什麼?

實測:(如上例項—-32位處理器+iar編譯器)

場景一:

typedef enum  enum_test;//
上圖可知:sizeof(enum_test)==4

場景二:

typedef enum  enum_test;
可知:此時sizeof(enum_test)==1

對比:sizeof(列舉)==列舉常量最大值的記憶體占用大小,32位處理器,最長4位元組,最小1位元組。

最近翻看lwip原始碼,看到原始碼作者的**,關於enum部分摘於此處。

list

of all memory pools managed by memp. memp_max represents a null pool at

theend */

typedef enum memp_t;

實現為每個pool定義乙個名稱/編號。

巨集定義部分:

lwip_mempool(***x,num,size,desc)memp_***x樣子,

其中:##在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 enummemp_t;
memp_max即列舉型別 常量元素的總數。

以上。。。。。

用enum關鍵字定義乙個列舉類

案例 前端要傳過來四個同種型別的值,根據值不同,查詢不同的資料,不想在後端 裡直接匹配 春天 equals 改變其硬編碼形式 使用場景 列舉類定義 列舉類 帶有屬性的 public enum season1 3.其他訴求,獲取列舉類物件屬性,final型別的字段不能被set,只有get獲取屬性值的方...

enum關鍵字 C語言深度剖析

列舉型別的定義方式如下 enum enum type name enum const 1,enum const 2,enum const n enum variable name 注意 enum type name是自定義的一種資料型別名,而enum variable name為enum type ...

c中的關鍵字

一 register 作用 請求編譯器盡可能的將變數存在cpu內部暫存器中,一般的變數存在記憶體中,當需要時cpu再從記憶體中把它抓取到cpu中,使用register把它存在cpu中省去了cpu從記憶體中抓取資料的時間,提高執行效率。注意 1 盡可能,因為cpu記憶體有限,不可能全放在裡面,一般把頻...