声明后的枚举器初始化

时间:2014-07-24 10:39:43

标签: c++ c++11 enums enumerator

考虑以下枚举声明:

enum Foo { Bar, Baz, Qux };

现在考虑我希望枚举器(Bar,Baz和Qux)具有某些值。我可以通过简单地在声明中初始化它来解决这个问题:

enum Foo { Bar = 4, Baz = 2, Qux = 42 };

现在,如果我不希望知道这些值,该怎么办?例如,当使用来自其他库的其他预定义值时,或者对两个枚举器使用相同的值时。例子:

enum Foo { Bar = MY_LIB_BAR, Baz = MY_LIB_BAZ, Qux = MY_LIB_QUX };
enum Foo { Bar = 0, Baz = 42, Qux = 0 };

我尝试过这样的事情:

// In header
enum Foo { Bar, Baz, Qux };
// In source
Foo { Bar = 0, Baz = 42, Qux = 0 };
// ...or...
Foo::Bar = 0, Foo::Baz = 42, Foo::Qux = 0;

显然,我的尝试都没有奏效。

所以,我的问题如下:有没有办法在声明之外初始化枚举器?如果是这样,如何做,例如在相应的.cpp源文件中?

编辑:我可以指定枚举的基础类型。考虑到C ++ 11允许前向声明,我认为我的问题可以解决,因为枚举成为一个完整的类型。

4 个答案:

答案 0 :(得分:1)

这是不可能的。原因很简单,例如,枚举通常用于switch语句中。对于这些语句,必须在编译时知道常量。如果你可以在标题中省略它们,那么编译器将无法编译另一个ocmpilation单元中的任何switch,因为它无法访问这些值。

同样适用于所有constexpr:它们必须在声明它们的地方定义,原因完全相同:编译器必须始终知道它们的值。

如果你真的需要隐藏int常数,那么只需将它们定义为通常的常量,例如:

Foo.hpp:

class Foo {
    static const int Bar;
    static const int Baz;
    static const int Qux;
}

Foo.cpp中:

const int Foo::Bar = 47;
const int Foo::Baz = 11;
const int Foo::Qux = 4711;

当然,您无法在switch语句中使用这些常量!

  

我可以指定枚举的基础类型。考虑到这一点   C ++ 11允许前向声明,我认为我的问题可能是   解决了,因为枚举变成了一个完整的类型。

这根本没有用!即使在C ++ 11和C ++ 14中,枚举常量的前向声明也是不可能的。

答案 1 :(得分:0)

没有办法 - 枚举始终将初始化程序作为枚举声明的一部分,并且不能将它们拆分为.cpp文件。它与C ++ 11类型的枚举相同。

答案 2 :(得分:0)

枚举是在编译时计算的常量值,因此您可以像许多其他类型一样将其拆分为声明和定义。枚举声明也必须是它的定义,所以当你声明它时,你需要它完整的值。

答案 3 :(得分:0)

枚举类型是设计意图的有限集。