定义在函数内使用的整数常量的典型方法是:
const int NumbeOfElements = 10;
在课堂上使用相同:
class Class {
...
static const int NumberOfElements = 10;
};
然后它可以用作固定大小的数组绑定,这意味着它在编译时是已知的。
很久以前编译器不支持后一种语法,这就是使用枚举的原因:
enum NumberOfElementsEnum { NumberOfElements = 10; }
现在几乎所有广泛使用的编译器都支持函数内const int
和类内static const int
语法,是否有任何理由将枚举用于此目的?
答案 0 :(得分:25)
原因主要是简洁。首先,enum
可以是匿名的:
class foo {
enum { bar = 1 };
};
这有效地引入了bar
作为整数常量。请注意,上述内容短于static const int
。
此外,如果&bar
成员是enum
,则没有人可以写 class foo {
static const int bar = 1;
}
。如果你这样做:
printf("%p", &foo::bar);
然后你班级的客户这样做:
foo::bar
然后他将得到一个编译时链接器错误bar
未定义(因为,作为左值,它不是)。在实践中,对于目前的标准,任何地方都使用foo::bar.
,其中整数常量表达式不是所需(即仅允许它),它需要一个不合格的enum
的类定义需要这样的表达式的地方是:case
初始值设定项,new[]
标签,类型中的数组大小(bar
除外)和积分的模板参数类型。因此,在其他地方使用static const int
技术上需要一个定义。有关详细信息,请参阅C++ Core Language Active Issue 712 - 截至目前尚无提议的解决方案。
实际上,现在大多数编译器都对此更加宽容,并且可以让您在不需要定义的情况下使用enum
变量的大多数“常识”用法。然而,角落情况可能会有所不同,因此很多人认为使用匿名{{1}}会更好,因为一切都很清楚,而且根本就没有歧义。
答案 1 :(得分:9)
直接在类定义中定义静态常量是C ++的后续添加,许多人仍然坚持使用enum
的旧解决方法。甚至可能还有一些旧的编译器仍在使用,它们不支持在类定义中直接定义的静态常量。
答案 2 :(得分:5)
在你的情况下,我也使用常数。但是,在其他情况下,我可能会添加其他相关常量。像这样:
const int TextFile = 1; // XXX Maybe add other constants for binary files etc.?
在这种情况下,我立即使用一个枚举值,如下所示:
enum FileType {
TextFile = 1
// XXX Maybe add other values for binary files etc.?
}
原因是当我在switch表达式中使用常量值时,编译器可以发出警告,如:
FileType type;
// ...
switch ( type ) {
case TextFile:
// ...
}
如果我决定添加另一个与现有值相关的常量值(在本例中为不同类型的文件),几乎所有编译器都会发出警告,因为在switch语句中没有处理新值。
如果我使用'int'和常量,编译器就没有机会发出警告。
答案 3 :(得分:5)
使用“enum hack”的唯一原因是旧编译器不支持类内const定义,正如您在问题中所说的那样。因此,除非您怀疑您的代码将被移植到旧的编译器,否则您应该使用const到期的const。
答案 4 :(得分:5)
使用枚举有一个优点。枚举类型是一种类型,因此如果您定义,例如:
enum EnumType { EnumValue1 = 10, EnumValue2 = 20 ... };
你的功能如下:
void Function1(EnumType Value)
编译器检查您是否将枚举EnumType的成员传递给函数,因此只有参数Value的有效值为EnumValue1和EnumValue2。如果使用常量并将函数更改为
void Function1(int Value)
编译器检查您是否正在向函数传递int(任何int,常量,变量或文字)。
枚举类型适用于分组相关的const值。对于只有一个const值,我看不出任何优势。
答案 5 :(得分:3)
我认为没有理由使用枚举,并且为此目的使用static const int
实际上更好,因为枚举有自己的类型(即使可以隐式转换为整数)。
答案 6 :(得分:2)
这两者之间存在差异。据我所知,枚举没有地址。虽然静态const int。因此,如果某人获取const static int的地址,抛弃const,他可以修改该值(尽管编译器可能会忽略该更改,因为他认为它是const)。这当然是纯粹的邪恶,你不应该这样做 - 但编译器无法阻止它。枚举不会发生这种情况。
当然 - 如果你(出于某种原因)需要那个const的地址,你需要静态的const int。
简而言之 - 枚举是一个右值,而const static int是一个左值。有关详细信息,请参阅http://www.embedded.com/story/OEG20011129S0065。
答案 7 :(得分:1)
嗯,可移植性 是使用枚举的一个很好的理由。这很棒,因为你不必担心你的编译器是否支持“static const int S = 10”......
另外,据我记忆,静态变量必须在某处定义,并且声明,并且必须仅声明枚举值。
答案 8 :(得分:-2)
底线 - 使用const。
更多详情:
我不是c ++专家,但这似乎是一个更笼统的设计问题。
如果它不是必须的,并且您认为枚举将增长到具有多于一个值的概率非常低/不存在,则使用常规const。 即使你错了,在未来的某个时候会有更多的价值观,使得枚举成为正确的选择 - 简单的重构,你将const改为enum。