Mec*_*cki 51
从技术上讲,这没关系.编译器甚至很可能为这两种情况创建相同的机器代码,但枚举有三个优点:
使用正确的编译器+调试器组合,调试器将按枚举名称而不是按其编号打印枚举变量.所以"StateBlahBlup"读起来要比"41"好得多,不是吗?
您没有明确地为每个州提供一个数字,如果您允许,编译器会为您编号.假设您已经有20个状态,并且您想在中间添加一个新状态,如果是定义,则必须自己进行所有重新编号.在枚举的情况下,您只需添加状态,编译器将为您重新编号低于此新状态的所有状态.
您可以告诉编译器警告您switch语句是否不处理所有可能的枚举值,例如因为您忘记处理某些值或因为枚举被扩展但您忘记也更新处理枚举值的switch语句(它将default
但是,如果有一种情况,则不会发出警告,因为所有未明确处理的值都会以默认情况结束).
没有明确的答案.enum
为您提供范围和自动值赋值,但不提供对常量类型的任何控制(始终signed int
).#define
忽略范围,但允许您使用更好的键入工具:允许您选择常量类型(通过使用后缀或通过在定义中包含显式强制转换).
所以,选择对你来说更重要的东西.对于状态机,enum
可能是更好的选择,除非您有充分的理由来控制类型.
我更喜欢枚举.它们更紧凑,更"安全".您还可以在枚举中暗示订单,这可能对状态机有帮助.如果可能,应该避免使用#defines,因为它们将覆盖源中的所有实例,这可能导致一些难以调试的意外操作.