2011-09-20 97 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; 

当你需要一个新的(传输)状态时,其他任何东西都不能很好地工作。当然,这会立即改变以前的所有值。如果你声称你的软件永远不会改变,我在布鲁克林有一座桥来卖给你。