使用匿名枚举
匿名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
enum
和const 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
然后你为了一个不会被改变的值而占用内存。