枚舉常量保證與(簽名)int
的大小相同。顯然你的系統使用32位int,所以大於0x7FFFFFFF的無符號十六進制文字將不適合。
所以這個警告不僅僅是「迂腐」,它暗示着一個可能嚴重的錯誤。請注意,GCC中的-pedantic
確實是而不是的意思是「挑剔,給我不重要的警告」,而是「確保我的代碼實際上遵循C標準」。
看來你想做一個位掩碼或硬件地址或其他硬件相關的編程列表。 enum
不適合執行此類任務,因爲在與硬件相關的編程中,您很少想使用簽名類型,但始終未使用簽名類型。
如果你必須有一個安全和便攜的程序,那麼沒有優雅的方式來做到這一點。 C是一種有很多缺陷的語言,enum
由標準定義的方式就是其中之一。
一個解決辦法是使用某種形式的「窮人的枚舉」,如:
typedef uint32_t STATUS;
#define THIRD 0X80000001
如果你還必須有一個枚舉的增加類型安全,那麼你可能使用結構:
typedef struct
{
uint32_t value;
} STATUS;
或者,也可以聲明一個常量數組並使用枚舉來定義數組索引。可能是最乾淨的解決方案,但需要一點額外的開銷:
typedef enum {
FIRST,
SECOND,
THIRD,
FOURTH,
FIFTH,
STATUS_N
} STATUS;
const uint32_t STATUS_DATA [STATUS_N] =
{
0,
1,
0X80000001,
0X80000002,
0X80000003
};
是不是'enum'保留關鍵字? –
是的,它創建一個枚舉。 – Caw
@sunqingyao是的。它應該用來創建一個枚舉,就像OP一樣。 – StoryTeller