这两个之间究竟有什么区别:
typedef enum {
something1,
something2,
.....
somethingN
} myEnum;
结束正好
enum myEnum{
something1,
something2,
.....
somethingN
};
我知道第一种情况下我使用了未命名的枚举类型,当然,我只是想知道哪种方法更好,以及为什么?
第一种变体对于C语言非常有用,因为否则你需要在每个想要使用它的地方写enum myEnum
。
在C++中不是这种情况。 所以,据我所知,在C++中没有第一种情况的好处(除非你正在定义需要与C共享的接口等)。
没有区别。实际上,第一个版本是C风格编码。
C++11引入了强类型枚举,定义方式如下:
enum class myEnum //note the 'class' keyword after the 'enum' keyword
{
something1,
something2,
.....
somethingN
};
在 C++03 中,枚举类型不是类型安全的,它们本质上是整数,并且可以隐式地混合使用其他整数类型,另一个问题是它们没有作用域;您可以在不限定其类型的情况下使用其成员;您可以使用 something1
。而 C++11 的强类型枚举是类型安全的,并且它们有作用域;您必须使用 myEnum::something1
。
namespace scope_for_my_enum { enum { foo, bar }; }
,或者 class scope_for_my_enum { enum { foo, bar }; };
,这取决于你是否允许客户端省略它。实际上,这意味着旧的枚举在作用域方面更加灵活。 - R. Martinho FernandesmyEnum::something1
,但是使用第一个则不行。此外,在某些情况下,您可以在C++11中前向声明枚举,但是无法前向声明未命名类型,并且也无法前向声明typedef。
enum
。选择enum class
更加安全。 - leftaroundaboutenum class
肯定是一种改进,但并不完全替代。它提供了两个功能(强制作用域和无隐式转换),但有时你只想要其中一个。 - R. Martinho Fernandes