使用匿名枚举

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

 enum { color = 1 }; 

为什么不只是声明int color = 1

枚举不占用任何空间,是不可改变的。

如果你使用const int color = 1; 那么你将解决可变性问题,但如果有人拿着color的地址( const int* p = &color; )那么它的空间将不得不分配。 这可能不是一个大问题,但除非你明确地要求人们能够把color的地址,你可能会阻止它。

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


免责声明:这个答案不应被视为build议使用enum的所有数字常量。 你应该做你(或你的牛仔)认为更可读的东西。 答案只是列出了一些人可能更喜欢使用enum

这是声明一个编译时整数常量的所谓枚举技巧。 这是有利的,它保证没有variables被实例化,因此没有运行时间的开销。 大多数编译器总是不带有整型常量的开销。

如果这是旧的代码,那么枚举可能已被用于“枚举黑客”。

您可以了解更多关于“enum hack”的信息,例如,在这个链接中: enum hack

这样做的一个用途是当你在做模板元编程,因为枚举对象不是左值,而static const成员。 对于不能让你在类定义中初始化静态整型常量的编译器,它也曾经是一个常用的解决方法。 这是另一个问题的解释。

 (1) int color = 1; 

color是可变的(意外)。

 (2) enum { color = 1 }; 

color不能改变。

另一个选项是enum

 const int color = 1; // 'color' is unmutable 

enumconst int都提供了完全相同的概念; 这是一个select的问题。 关于enum节省空间的普遍看法,IMO没有与之相关的内存约束,编译器足够聪明,可以在需要时优化const int

[注意:如果有人试图在const int上使用const_cast<> ; 它会导致未定义的行为(这是不好的)。 但是, enum也是不可能的。 所以我个人最喜欢的是enum ]

我没有看到它提到,另一个用途是范围你的常量。 我目前正在使用Visual Studio 2005编写的代码,现在移植到android – g ++。 在VS2005中,你可以有这样的代码enum MyOpts { OPT1 = 1 }; 并作为MyOpts :: OPT1使用它 – 编译器没有抱怨,即使它是无效的。 g ++将这样的代码报告为错误,所以一个解决scheme是使用匿名枚举,如下所示: struct MyOpts { enum {OPT1 =1}; }; struct MyOpts { enum {OPT1 =1}; }; ,现在这两个编译器都很开心。

当你使用
enum {color = 1}
你没有使用任何内存
#define color 1

如果你声明一个variables
int color=1然后你为了一个不会被改变的值而占用内存。