Bre*_*ugh 7 c++ enums enumeration visual-studio
我正在使用C++中的自定义枚举类型,但它没有很多值.我想尝试减少它们占用的大小,我听说默认情况下enum类型总是整数.然后我遇到了关于C++枚举的MSDN条目,发现以下语法非常有趣:
enum [: type] {enum-list};
Run Code Online (Sandbox Code Playgroud)
果然,当我做了以下事情时,它编译了我想要的东西(VS2008):
enum plane : unsigned char { xy, xz, yz };
Run Code Online (Sandbox Code Playgroud)
现在,你可以从我的枚举常量中看到我在空间方面不需要太多 - 一个unsigned char类型对我的用途来说是完美的.
但是,我不得不说,我从来没有在互联网上的任何其他地方看到过这种形式- 大多数人甚至都没有意识到这一点.我试图使这个代码跨平台(并且可能在嵌入式系统上使用),所以它让我想知道......这是正确的C++语法,还是只有MSVC编译器支持?
编辑:似乎此功能现在是C++ 11及更高版本的一部分,并且称为范围枚举.
小智 7
这是非标准的,但预计它将成为C++ 0x标准的一部分.对我来说,当我在Visual Studio 2005中编译并将警告级别设置为最大值时,我收到以下警告:
警告C4480:使用非标准扩展名:为枚举'Test'指定基础类型
在标准C++中,枚举不是类型安全的.即使枚举类型不同,它们也是有效的整数.这允许比较不同枚举类型的两个枚举值.该C++ 03提供了唯一的安全是一个整数或一个枚举类型的值不会隐式转换为另一种类型的枚举.另外,底层整数类型是实现定义的; 因此,依赖于枚举大小的代码是不可移植的.最后,枚举值的范围限定为封闭范围.因此,两个单独的枚举不可能具有匹配的成员名称.
此外,C++ 0x将允许标准枚举提供显式作用域以及基础类型的定义:
enum Enum3 : unsigned long {Val1 = 1, Val2};
Run Code Online (Sandbox Code Playgroud)
正如 0A0D 所说,您使用的表示法在 C++03 中是非标准的,但已被 C++11 在术语“作用域枚举”下采用。
如果这对您来说还不够快,那么您可以考虑显式指定用于嵌入枚举字段的大小关键结构中的位字段宽度。这种方法很丑陋——为了完整起见,我提到了 if ;如果这是一个好的解决方案,那么 C++11 就不会采用上面的表示法。一个问题是,您依赖可选的编译器警告来检测太小的位字段以容纳可能的值,并且可能必须在枚举值发生变化时手动检查它们。
例如:
enum E
{
A, B, C
};
struct X
{
E e1 : 2;
E e2 : 2;
E e3 : 2;
E e4 : 2;
};
Run Code Online (Sandbox Code Playgroud)
注意:枚举可能占用比请求更多的位 - 在没有显式编译器选项的 GCC 4.5.2 上,sizeof(X)上面仍然是 4....