簡體   English   中英

在C中定義枚舉類型

[英]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;

不,你不能。

從標准§ 6.4.4.3 C11標准N1570

聲明為枚舉常量的標識符的類型為int。

根據C11標准的§6.7.2.23enum列表中的標識符的類型為int

枚舉器列表中的標識符被聲明為具有int類型的常量,並且可以在允許的任何位置出現。

但是,枚舉構成了不同的類型§6.2.516:

每個不同的枚舉構成一個不同的枚舉類型。

對於枚舉類型本身,該標准僅在§6.7.2.24中指出:

每個枚舉類型應與char ,有signed整數類型或unsigned整數類型兼容。 類型的選擇是實現定義的,但應能夠表示枚舉的所有成員的值。

此外, 在腳注中指出:

一個實現可能會延遲選擇哪種整數類型,直到看到所有枚舉常量為止。

因此,枚舉的類型是不同的,並且此類型必須與char ,有signed整數類型或unsigned整數類型之一兼容。 將使用其中的哪一個是實現定義的,並且在同一實現上可能因情況而異。

如何將枚舉的類型定義為uint8而不是int

你不能 根據C標准的 6.7.2.2枚舉說明符第2段:

定義枚舉常量值的表達式應為整數常量表達式,其值可表示為int

如果使用GCC,則可以使用__attribute__ ((packed))減小這種類型的變量的大小。 這里

附加到枚舉,結構或聯合類型定義的此[ packed ]屬性指定使用最少的必需內存來表示類型。

由於您的枚舉值的范圍僅在0到255之間,因此當應用此屬性時,它將適合單個字節。

有一個相關的編譯器選項:

在[command]行上指定-fshort-enums標志等效於在所有enum定義上指定packed屬性。

正如其他答案中已經提到的那樣,沒有標准的方法可以解決此問題,因為該標准指出枚舉常量是int 枚舉常量和變量的類型是該語言中已知的主要缺陷。

解決方法是簡單地在每次使用枚舉常量時將其轉換為uint8_t 當值的大小和符號性很重要時,最好完全避免枚舉。 #defineconst可用於創建類型安全的替代項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM