是否有理由使用枚举在C ++代码中定义单个常量?

时间:2009-09-04 07:26:15

标签: c++ enums constants

定义在函数内使用的整数常量的典型方法是:

const int NumbeOfElements = 10;

在课堂上使用相同:

class Class {
...
    static const int NumberOfElements = 10;
};

然后它可以用作固定大小的数组绑定,这意味着它在编译时是已知的。

很久以前编译器不支持后一种语法,这就是使用枚举的原因:

enum NumberOfElementsEnum { NumberOfElements = 10; }

现在几乎所有广泛使用的编译器都支持函数内const int和类内static const int语法,是否有任何理由将枚举用于此目的?

9 个答案:

答案 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。