[英]Define enum type in C
如何將枚舉的類型定義為uint8而不是int ?
typedef enum
{
R_DIRECTION_LEFT = 1,
R_DIRECTION_RIGHT = 2,
R_DIRECTION_TOP = 4,
R_DIRECTION_BOTTOM = 8
} R_Direction;
根據C11標准的§6.7.2.23 , enum
列表中的標識符的類型為int
:
枚舉器列表中的標識符被聲明為具有
int
類型的常量,並且可以在允許的任何位置出現。
但是,枚舉構成了不同的類型§6.2.516:
每個不同的枚舉構成一個不同的枚舉類型。
對於枚舉類型本身,該標准僅在§6.7.2.24中指出:
每個枚舉類型應與
char
,有signed
整數類型或unsigned
整數類型兼容。 類型的選擇是實現定義的,但應能夠表示枚舉的所有成員的值。
此外, 在腳注中指出:
一個實現可能會延遲選擇哪種整數類型,直到看到所有枚舉常量為止。
因此,枚舉的類型是不同的,並且此類型必須與char
,有signed
整數類型或unsigned
整數類型之一兼容。 將使用其中的哪一個是實現定義的,並且在同一實現上可能因情況而異。
如果使用GCC,則可以使用__attribute__ ((packed))
減小這種類型的變量的大小。 從這里 :
附加到枚舉,結構或聯合類型定義的此[
packed
]屬性指定使用最少的必需內存來表示類型。
由於您的枚舉值的范圍僅在0到255之間,因此當應用此屬性時,它將適合單個字節。
有一個相關的編譯器選項:
在[command]行上指定
-fshort-enums
標志等效於在所有enum
定義上指定packed屬性。
正如其他答案中已經提到的那樣,沒有標准的方法可以解決此問題,因為該標准指出枚舉常量是int
。 枚舉常量和變量的類型是該語言中已知的主要缺陷。
解決方法是簡單地在每次使用枚舉常量時將其轉換為uint8_t
。 當值的大小和符號性很重要時,最好完全避免枚舉。 #define
或const
可用於創建類型安全的替代項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.