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