【问题标题】:Why use enum when #define is just as efficient? [duplicate]当#define 同样有效时,为什么要使用枚举? [复制]
【发布时间】:2011-07-11 17:24:40
【问题描述】:

所以一个枚举是这样工作的:

enum {
  false,
  true
}

相当于

int false = 0
int true = 1

我为什么不将enum 替换为#define

#define FALSE 0
#define TRUE 1

在我看来,它们似乎是可以互换的。我知道#define 能够处理参数,因此以与enum 完全不同的方式运行。当我们有#define 时,enum 的主要用途究竟是什么在这种情况下

如果我猜的话,#define 是一个预处理器功能,enum 将具有一些运行时优势。我还有多远?

提前致谢。

【问题讨论】:

  • 奇怪,我的搜索结果中没有出现那个。谢谢!
  • 它不等同于int false = 0 也不等同于int const false = 0(这会更合适)。 int 变量会有一个地址,然后你可以使用&false,而enum 则不能。
  • 请注意,SO 136946 被标记为 C++ 和 C。名义上,它不如 SO 1674032 仅适用于 C,但我可能会被说服。跨度>
  • 有趣的是,我发现这个问题的同时想知道恰恰相反:为什么 C 程序员使用 #definess 而不是 enums。

标签: c enums


【解决方案1】:

虽然您的问题被标记为 C,但使用 C++ 编写时有一个很大的优势,您可以将 enum:s 放在类或命名空间中。

这样你可以引用你的常量,比如SpaceshipClass::galaxy

【讨论】:

    【解决方案2】:

    enum 的优势体现在您有一长串想要映射为数字的事物,并且您希望能够在该列表的中间插入一些东西。例如,您有:

    梨 0 苹果 1 橘子 2 葡萄 3 桃子 4 杏子 5

    现在您想将tangerines 放在oranges 之后。对于#defines,您必须重新定义grapespeachesapricots 的数量。使用枚举,它会自动发生。是的,这是一个人为的例子,但希望它能给你一个想法。

    【讨论】:

    • 是的,我现在看到了不同之处。谢谢!
    • 这是一个很好的答案。 但假设读者(可能是任何 NOOB)知道她可以用pears 0 声明enum,而不是对其余部分编号。
    【解决方案3】:

    枚举是一个整数常量。所以,在编译过程中会有一个类型检查。

    【讨论】:

    • 0 和 1 也是整数常量。
    • 感谢您指出正确的吉姆。我似乎已经阅读了 enum w.r.t. 的一些含义。类型转换并直接传达它而不看真正的问题。另一种划分是在块范围内使用枚举。
    • 在 C++ 中,枚举是单独的类型,但在 C 中不是。
    【解决方案4】:

    我发现它对于在 gdb 等环境中进行调试很有用,因为枚举值是在编译时处理的(其中 #define 是一个预处理器宏),因此可用于自省。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 2015-12-10
      • 2013-06-02
      • 1970-01-01
      • 2014-04-28
      • 2012-04-08
      • 2016-10-02
      相关资源
      最近更新 更多