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

sha*_*oth 14 c++ enums constants

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

const int NumbeOfElements = 10;
Run Code Online (Sandbox Code Playgroud)

在课堂上使用相同:

class Class {
...
    static const int NumberOfElements = 10;
};
Run Code Online (Sandbox Code Playgroud)

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

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

enum NumberOfElementsEnum { NumberOfElements = 10; }
Run Code Online (Sandbox Code Playgroud)

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

Pav*_*aev 26

原因主要是简洁.首先,一个enum可以是匿名的:

 class foo {
    enum { bar = 1 };
 };
Run Code Online (Sandbox Code Playgroud)

这有效地引入bar了一个整数常数.请注意,上述内容短于static const int.

此外,&bar如果它是enum会员,没有人可以写.如果你这样做:

 class foo {
    static const int bar = 1;
 }
Run Code Online (Sandbox Code Playgroud)

然后你班级的客户这样做:

 printf("%p", &foo::bar);
Run Code Online (Sandbox Code Playgroud)

那么他将得到一个foo::bar未定义的编译时链接器错误(因为,作为一个左值,它不是).在实践中,根据标准,因为它目前为,在任何地方bar使用其中不整数表达式中需要(即,其中它仅允许),它需要一个外的类定义foo::bar.在需要这样的表达是该地方:enum初始值设定项,case标签,类型中的数组大小(除外new[])和整数类型的模板参数.因此,bar在技​​术上使用其他任何地方都需要定义.有关详细信息,请参阅C++核心语言活动问题712 - 目前尚无提议的解决方案.

实际上,现在大多数编译器都对此更加宽容,并且可以让您static const int在不需要定义的情况下使用变量的大多数"常识"使用.然而,角落的情况可能会有所不同,因此很多人认为使用匿名更好enum,因为一切都很清楚,并且根本没有歧义.


sbi*_*sbi 9

直接在类定义中定义静态常量是C++的后续添加,许多人仍然坚持使用enumfor 的旧解决方法.甚至可能还有一些旧的编译器仍在使用,它们不支持在类定义中直接定义的静态常量.

  • 有些编译器并不总是内联静态const int,而枚举将始终是内联AFAIK. (2认同)

Fre*_*abe 5

在你的情况下,我也使用常量.但是,在其他情况下,我可能会添加其他相关常量.像这样:

const int TextFile = 1; // XXX Maybe add other constants for binary files etc.?
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我立即使用一个枚举值,如下所示:

enum FileType {
    TextFile = 1
    // XXX Maybe add other values for binary files etc.?
}
Run Code Online (Sandbox Code Playgroud)

原因是当我在switch表达式中使用常量值时,编译器可以发出警告,如:

FileType type;
// ...
switch ( type ) {
    case TextFile:
       // ...
}
Run Code Online (Sandbox Code Playgroud)

如果我决定添加另一个与现有值相关的常量值(在本例中为不同类型的文件),几乎所有编译器都会发出警告,因为在switch语句中没有处理新值.

如果我使用'int'和常量,编译器将没有机会发出警告.


Gor*_*pik 5

使用"枚举黑客"的唯一原因是旧编译器不支持类内const定义,正如您在问题中所说的那样.因此,除非您怀疑您的代码将被移植到旧的编译器,否则您应该使用const到期的const.


小智 5

使用枚举有一个优点.枚举类型是一种类型,因此如果您定义,例如:

enum EnumType { EnumValue1 = 10, EnumValue2 = 20 ... };
Run Code Online (Sandbox Code Playgroud)

你有一个像这样的功能:

void Function1(EnumType Value)
Run Code Online (Sandbox Code Playgroud)

编译器检查您是否将枚举EnumType的成员传递给函数,因此只有参数Value的有效值为EnumValue1和EnumValue2.如果使用常量并将函数更改为

void Function1(int Value)
Run Code Online (Sandbox Code Playgroud)

编译器检查您是否正在向函数传递int(任何int,常量,变量或文字).

枚举类型适用于分组相关的const值.对于只有一个const值,我没有看到任何优势.