2013-06-21 103 views
2

使用typedef enum { VALUE_1 = 0x00, ... } typeName;是否在C中有更多開銷(具體來說,使用AVR-GCC編譯爲AVR MCU)比使用typedef unsigned char typeName;,然後僅使用#define VALUE_1 0x00定義每個值?C typedef枚舉彙編

我的具體應用是狀態碼,可以通過函數返回和檢查。對我來說,使用typedef enum風格似乎更加貼心,但我想確保它不會增加編譯應用程序的任何重大開銷。

我會承認沒有,但我並不確定。我試圖尋找類似的問題,但其中大部分都與C++有關,並且得到了更具體的C++答案。

+4

不,枚舉的編譯時常量也在C中。 –

回答

3

enum聲明創建了一個枚舉類型。這種類型與某些預定義的整數類型兼容(因此具有相同的大小和表示形式),但編譯器選擇哪一種。

但枚舉常量總是int類型。 (這不同於C++,其中常數是枚舉類型的。)

所以typedef unsigned char ...typedef enum ...將可能改變的類型的大小和表示,如果定義的類型或功能的對象可以不管返回的類型,但常數VALUE_1等將是int類型的任何一種方式。

可能最好使用enum類型;這樣編譯器可以決定哪種表示是最好的。指定unsigned char的替代方法可以最大限度地減少存儲空間,但根據平臺的不同,實際上可能會減慢訪問對象的速度,例如使用與int兼容的東西。

順便提一下,typedef並非嚴格必要。如果你願意,你可以使用一個標籤

enum typeName { Value_1 = 0x00, ... }; 

但你必須引用類型爲enum typeName,而不僅僅是typeNametypedef的優點是它可以讓你給這個類型一個只有一個標識符的名稱。