"静态枚举"在C++中意味着什么?

Mar*_*n K 32 c++ enums static visual-studio

我最近遇到过这个:

static enum Response{
    NO_ERROR=0,
    MISSING_DESCRIPTOR,
    ...
};
Run Code Online (Sandbox Code Playgroud)

它在Microsoft VS2005下编译和工作.但是,我不确定'静态'修饰符应该做什么.它与以下有何不同?

enum Response {
    NO_ERROR=0,
    MISSING_DESCRIPTOR,
    ...
};
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 57

删除省略号的确切代码不是有效的C++.您不能staticenum声明中使用存储类说明符; 它没有任何意义(只能声明对象,函数和匿名联合static).

但是,您可以enum在一个声明中声明一个和一个变量:

static enum Response {
    NO_ERROR = 0,
    MISSING_DESCRIPTOR
} x; 
Run Code Online (Sandbox Code Playgroud)

static这里适用于x和你说,这实际上是相同的:

enum Response { 
    NO_ERROR = 0,
    MISSING_DESCRIPTOR
};

static Response x;
Run Code Online (Sandbox Code Playgroud)


Gra*_*amS 14

令人惊讶的是,你也可以在其中放置其他的decl-specifiers.
这在VS2008中编译得很好:

auto const enum TestEnum {
    Why,
    Does
};

register volatile enum TestEnum2 {
    This,
    Work
};
Run Code Online (Sandbox Code Playgroud)

但它完全没有意义:)

我怀疑这里的问题是解析,因为这样的代码:

enum TestEnum3 { Hello, World };  // Define enum
enum TestEnum3 x = World;         // Use enum
Run Code Online (Sandbox Code Playgroud)

也可以写成:

enum TestEnum3 { Hello, World } x = World; // Define and use enum.
Run Code Online (Sandbox Code Playgroud)

有趣的是,我注意到你是否在VS2008中这样做:

enum TestEnum3 { Hello, World };
const enum TestEnum3 e3 = World;
const enum TestEnum4 { F, M, L } e4 = F;

e3 = Hello; // error C2166: l-value specifies const object (Good!)
e4 = M;     // NO ERROR here though - why?
Run Code Online (Sandbox Code Playgroud)

因此它们不等同于TestEnum4它似乎丢弃了const decl-specifier的情况.一切都很奇怪.


Naw*_*waz 7

static enum Response { /*... */ };
Run Code Online (Sandbox Code Playgroud)

您无法static在C++中定义枚举. static只能是枚举的变量,而不是类型本身!

使用GCC版本编译代码时4.3.4,会出现以下错误:

prog.cpp:7:错误:只能为对象和函数指定存储类

在ideone上在线查看:http://www.ideone.com/cI1bt

我认为这一切都说.

-

但是,如果要限制其自己的转换单元中的类型 enum Response,则可以使用未命名的命名空间.看看这个主题:

未命名的命名空间优于静态?