2011-09-20 39 views
0
gcc (Ubuntu/Linaro 4.6.1-9ubuntu2) 4.6.1 
c89 

什麼是爲枚舉元素賦值的正確約定,所以與其他枚舉類型沒有衝突?爲枚舉元素賦值的正確約定

我經常看到十六進制格式,我使用的是想知道這有什麼理由嗎?

在我的源代碼中,我有一個以上的枚舉類型,所以我也做了以下內容:

typedef enum transfer_states_e { 
    /* Call transfer bind/supervised */ 
    STATE_TRANSFER_IDLE  = 0x1, 

    STATE_INIT_BLIND  = 0x2, 
    STATE_INIT_SUPERVISED = 0x3, 

    STATE_INVOKE_BLIND  = 0x4, 
    STATE_INVOKE_SUPERVISED = 0x5 
} transfer_states_e; 

typedef enum states_e { 
    /* Initial state */ 
    STATE_IDLE = 0x6, 
    STATE_NULL = 0x7, 
    . 
    . 
    . 
} states_e; 

的任何建議非常感謝,

回答

3

沒有必要讓枚舉值在整個項目中唯一,除非單個地址或變量可能包含屬於多個枚舉的值。這是不太可能的,但它可能是一個理智的措施。

枚舉值可能以十六進制格式編碼,以便在進行網絡通信的項目上進行調試,因爲Wireshark等應用程序傾向於顯示十六進制輸出。更可能的是,這只是程序員的個人偏好。

+1

十六進制適用於標誌位:0x01,0x02,0x04,0x08,0x10,... –

1

如果您想要的值是唯一的,他們應該屬於一個枚舉。單獨枚舉可以具有重疊的值集合,而不會對普通C程序造成任何問題。

如果你真的有機管局很好的理由需要跨越枚舉不相交的集合值的,那麼我想你應該定義每個枚舉的一個傳統的「最後一個成員」,並用它來啓動下一個:

typedef enum transfer_states_e { 
    /* Call transfer bind/supervised */ 
    STATE_TRANSFER_IDLE = 1, 
    STATE_INIT_BLIND, 
    STATE_INIT_SUPERVISED, 
    STATE_INVOKE_BLIND, 
    STATE_INVOKE_SUPERVISED, 
    STATE_TRANSFER_LAST = STATE_INVOKE_SUPERVISED 
} transfer_states_e; 

typedef enum states_e { 
    /* Initial state */ 
    STATE_IDLE = STATE_TRANSFER_LAST + 1, 
    STATE_NULL, 
    . 
    . 
    . 
    STATE_LAST = ... 
} states_e; 

當你需要一個新的(傳輸)狀態時,其他任何東西都不能很好地工作。當然,這會立即改變以前的所有值。如果你聲稱你的軟件永遠不會改變,我在布魯克林有一座橋來賣給你。