为枚举元素赋值的正确惯例

时间:2011-09-20 05:51:42

标签: c

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;

非常感谢任何建议,

2 个答案:

答案 0 :(得分:3)

除非单个地址或变量可能包含属于多个枚举的值,否则不需要在项目中使枚举值唯一。这是不太可能的,但它可能是一种理智的措施。

枚举值可能以十六进制格式编码,以便于在进行网络通信的项目上进行调试,因为Wireshark等应用程序倾向于显示十六进制输出。更有可能的是,这只是程序员的个人偏好。

答案 1 :(得分: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;

当您需要新的(转移)状态时,其他任何事情都无法正常工作。当然,这将立即改变以前的所有值。如果你声称你的软件永远不会改变,我在布鲁克林有一座桥梁可以卖给你。

相关问题