匿名枚举的用法

65 c++ enums

匿名enum声明的目的是什么,例如:

enum { color = 1 };
Run Code Online (Sandbox Code Playgroud)

为什么不宣布int color = 1

sha*_*oth 81

这是一个所谓的枚举技巧,用于声明编译时整数常量.它的优点是它保证不会实例化变量,因此没有运行时开销.无论如何,大多数编译器都没有引入整数常量的开销.

  • +1应该接受答案.伟大,简短和甜蜜的解释. (3认同)
  • 我也喜欢这个答案。通过翻阅 Linux 的内核源代码,我现在意识到了这个*技巧*。使用 *enum* 而不是 *const int* 替代方案的一个可能原因是,使用 enum 允许采用一种有组织的方法对类似用途的名称进行分组。 (2认同)

Mot*_*tti 58

枚举不占用任何空间并且是不可变的.

如果你使用const int color = 1;那么你将解决可变性问题,但如果有人拿了color(const int* p = &color;)的地址,那么就必须分配它的空间.这可能不是什么大问题,但除非你明确希望人们能够取得你的地址,否则color可能会阻止它.

同样,当在类中声明一个常量字段时,它必须是static const (对于现代C++而言不是这样)并且并非所有编译器都支持静态const成员的内联初始化.


免责声明:此答案不应被视为enum用于所有数字常量的建议.你应该做你(或你的牛人)认为更具可读性的事情.答案只列出了一些人可能更愿意使用的原因enum.

  • @Motti:我喜欢"牛犊".感谢:) (16认同)
  • @AtoMerZ:这就是为什么我说"这取决于".而且,这不是一个公平的比较; 你不能在运行时更改`enum`! (5认同)
  • `const int`是不可变的,并且可能不会占用任何空间,具体取决于编译器选择做什么. (4认同)

Era*_*man 7

如果这是旧代码,则enum可能已用于"枚举黑客".

您可以在此链接中了解有关"枚举黑客"的更多信息:enum hack

  • 已投票,但我建议您在答案中也描述一下 enum hack,以防该链接在未来 20 年内失效。 (4认同)

iam*_*ind 6

(1) int color = 1;
Run Code Online (Sandbox Code Playgroud)

color是可变的(意外地)。

(2) enum { color = 1 };
Run Code Online (Sandbox Code Playgroud)

color无法更改。

另一个选项enum是,

const int color = 1;  // 'color' is unmutable
Run Code Online (Sandbox Code Playgroud)

两者enumconst int提供完全相同的概念;这是一个选择的问题。关于enum节省空间的流行观点,IMO 没有与之相关的内存限制,编译器足够聪明,可以const int在需要时进行优化。

[注意:如果有人尝试在;const_cast<>上使用 const int它将导致未定义的行为(这是不好的)。然而,同样的情况对于 来说是不可能的enum。所以我个人最喜欢的是enum]

  • 但一般来说,应该首选“const int”,因为语义更符合意图(它不是枚举!)。 (6认同)
  • @Eran:不。如果它被声明为 const,你就不能通过 `const_cast` 将 constness 去掉:这是未定义的行为。 (5认同)
  • @iammilind:“更有组织性”?YMMV,但我的方法是确保我的代码的语义尽可能符合我的意图。如果你不小心抛弃了常量,那么你就会遇到更大的问题! (2认同)

R. *_*des 5

一种用途是在进行模板元编程时,因为枚举对象不是左值,而static const成员则不是左值。对于过去不允许您在类定义中初始化静态整数常量的编译器,它也是一种常见的解决方法。这在另一个问题中得到了解释。

  • 我相信元编程中的使用已经消失了,因为 C++11 添加了 `constexpr`。 (2认同)