有没有做这样的事情:
namespace status{
enum status{
ok,
error
};
}
并像status::ok
或者我应该这样做:
enum status{
status_ok,
status_error
};
并像status_ok
一样使用它?
更新 使用C ++ 11,您现在应该这样做:
enum class status {
ok,
error
};
并使用如下:status::ok
答案 0 :(得分:21)
我个人不喜欢第二种变体,因为status_
部分对我来说似乎是多余的。前一个版本避免了这个问题,但是类型status::status
看起来也很奇怪。此外,命名空间可以修改,所以如果有人做了像
namespace status {
void error( const char *msg );
}
由于函数error
与enum
值冲突,您将收到编译器错误。
我更喜欢使用第三种变体:
struct MouseButton {
enum Value {
Left, Middle, Right
};
};
这让我可以编写像
这样的函数void handleMouseButton( MouseButton::Value b ) {
switch ( b ) {
case MouseButton::Left: // ...
case MouseButton::Middle: // ...
case MouseButton::Right: // ...
}
}
答案 1 :(得分:7)
在启用C ++ 0x扩展时,您刚想要添加到C ++中。但是,如果您不能使用C ++ 0x功能,我建议这样做:
struct status
{
enum value
{
ok,
error
};
};
通过这样的声明你可以写:
status::value var = status::ok;
这样的结构还允许您在struct
范围内声明与状态类型相关的函数。例如,状态struct
可以包含转换为字符串的方法。
答案 2 :(得分:3)
如果您不担心使用enum status
类型,那么您可以保持匿名。
namespace status{
enum { // <--- no name
ok,
error
};
}
答案 3 :(得分:1)
首先,您应该使用范围运算符enum
而不是点::
运算符访问.
;即status::ok
两者都很好,你觉得它更具可读性。请注意,您也可以使用(不使用namespace
)
enum status{
ok,
error
}
仍然使用status::ok
,但有些编译器会警告您额外的status::
是不必要的。
编辑:使用enum
访问::
似乎只适用于MS visual-c ++
答案 4 :(得分:0)
我更喜欢命名空间方法,因为它允许using namespace
并使用较短的枚举值,如果在一段代码中只使用了一个枚举。
这主要是个人偏好的问题,但是,我认为在C ++中解决(潜在的)名称冲突最好使用命名空间来完成,因为这首先是拥有命名空间。