#define还是enum?

SSS*_*SSS 15 c

可能重复:
为什么#define同样有效时使用枚举?

在C语言编程时,最好使用#define语句或枚举用于状态机中的状态吗?

Mec*_*cki 51

从技术上讲,这没关系.编译器甚至很可能为这两种情况创建相同的机器代码,但枚举有三个优点:

  1. 使用正确的编译器+调试器组合,调试器将按枚举名称而不是按其编号打印枚举变量.所以"StateBlahBlup"读起来要比"41"好得多,不是吗?

  2. 您没有明确地为每个州提供一个数字,如果您允许,编译器会为您编号.假设您已经有20个状态,并且您想在中间添加一个新状态,如果是定义,则必须自己进行所有重新编号.在枚举的情况下,您只需添加状态,编译器将为您重新编号低于此新状态的所有状态.

  3. 您可以告诉编译器警告您switch语句是否不处理所有可能的枚举值,例如因为您忘记处理某些值或因为枚举被扩展但您忘记也更新处理枚举值的switch语句(它将default但是,如果有一种情况,则不会发出警告,因为所有未明确处理的值都会以默认情况结束).

  • 好的答案...... +1 (5认同)
  • 4.与#define不同,枚举值在符号信息中表示,这意味着像GDB这样的东西可以在表达式中显示/使用它(这与第1点有关)。5. 你可以#undef #define 然后创建另一个,所以它不像枚举那样一成不变。 (2认同)

Dan*_*uţă 12

由于状态是相关元素,我认为最好有一个定义它们的枚举.


AnT*_*AnT 9

没有明确的答案.enum为您提供范围和自动值赋值,但不提供对常量类型的任何控制(始终signed int).#define忽略范围,但允许您使用更好的键入工具:允许您选择常量类型(通过使用后缀或通过在定义中包含显式强制转换).

所以,选择对你来说更重要的东西.对于状态机,enum可能是更好的选择,除非您有充分的理由来控制类型.


Ada*_*mke 8

我更喜欢枚举.它们更紧凑,更"安全".您还可以在枚举中暗示订单,这可能对状态机有帮助.如果可能,应该避免使用#defines,因为它们将覆盖源中的所有实例,这可能导致一些难以调试的意外操作.