在 C++0x 中指定枚举大小
Specifying enum size in C++0x
我对 C++03
中的非作用域枚举行为有疑问。我已阅读有关 Stack overflow 和其他页面的多个问题和文章。
我正在使用 C++0x
标准和 运行 GCC 4.6.4
我能够用大小(如 int)定义非作用域枚举。参考 godbolt
#include<iostream>
enum Enum: int;
enum Enum: int
{
first,
second,
third
};
int main()
{
int numbers = first;
switch (numbers)
{
case first: break;
case second: break;
default: break;
}
return 0;
}
不指定枚举的大小是 C++11
功能吗?
我在 Whosebug claiming that we can define scoped enums with size if we declare them before defining. That answer provided Wiki link 上找到了答案。但是 wiki link 已针对 C++11
进行了更新,并且 C++03
的引用已被删除。
那么C++03
中enum
的大小可不可以定义?代码(上面粘贴的)是有效的 C++03
代码吗?如果我们可以定义那么它会影响 enum
的基础类型吗?
Isn't specifying the size of enum is C++11 feature?
您似乎指的是指定基础类型。是的,它是在 C++11 中引入的。
So can we define or not the size of enum in C++03?
不,我们不能。
Is the code(pasted above)is a valid C++03 code?
不,不是。
I am using C++0x standard
C++0x 是 C++11 在开发时的名称。当初选这个名字的时候,他们可能希望能在2010年之前发表。
因此,如果您使用“C++0x”,则您使用的是 C++11 标准草案的实验性实现,因此此功能可能可用。请注意,完全支持 C++11 的较新 GCC 仍然接受 -std=c++0x
选项,在这种情况下,您实际上会使用 C++11 的完整且稳定的实现。 GCC 4.6.4 虽然没有完全支持。
同样,C++1y是C++14的工作名称,C++2a对应C++20,C++2b对应C++23(希望如此)。
我想指出的是,对于 非作用域 枚举,C++11 之前和 post,你可以做的是 wrap the enum in a Typesafe Idiom idiom 以指定您想要的尺寸。
(请注意:执行此操作后,包装类型是 class
类型,而不是 enum
或标量类型)
或者,特别是对于 GCC,您可以向枚举添加一个值,该值具有您想要的大小的最大有效值(例如:(uint64_t)-1
用于 64 位枚举)/最大的负值,然后启用 --fshort-enums
标志,这将确保枚举具有适合您的值的最小整数类型。在你的例子中,你需要这样的东西:
enum Enum
{
first,
second,
third,
_dummy = INT_MIN
};
不要引用我的话,但这 应该 可移植到编译器实现 -fshort-enums
或等效编译器标志的所有标准版本,这意味着您可以使用此代码前和 post- C++11.
我对 C++03
中的非作用域枚举行为有疑问。我已阅读有关 Stack overflow 和其他页面的多个问题和文章。
我正在使用 C++0x
标准和 运行 GCC 4.6.4
我能够用大小(如 int)定义非作用域枚举。参考 godbolt
#include<iostream>
enum Enum: int;
enum Enum: int
{
first,
second,
third
};
int main()
{
int numbers = first;
switch (numbers)
{
case first: break;
case second: break;
default: break;
}
return 0;
}
不指定枚举的大小是 C++11
功能吗?
我在 Whosebug claiming that we can define scoped enums with size if we declare them before defining. That answer provided Wiki link 上找到了答案。但是 wiki link 已针对 C++11
进行了更新,并且 C++03
的引用已被删除。
那么C++03
中enum
的大小可不可以定义?代码(上面粘贴的)是有效的 C++03
代码吗?如果我们可以定义那么它会影响 enum
的基础类型吗?
Isn't specifying the size of enum is C++11 feature?
您似乎指的是指定基础类型。是的,它是在 C++11 中引入的。
So can we define or not the size of enum in C++03?
不,我们不能。
Is the code(pasted above)is a valid C++03 code?
不,不是。
I am using C++0x standard
C++0x 是 C++11 在开发时的名称。当初选这个名字的时候,他们可能希望能在2010年之前发表。
因此,如果您使用“C++0x”,则您使用的是 C++11 标准草案的实验性实现,因此此功能可能可用。请注意,完全支持 C++11 的较新 GCC 仍然接受 -std=c++0x
选项,在这种情况下,您实际上会使用 C++11 的完整且稳定的实现。 GCC 4.6.4 虽然没有完全支持。
同样,C++1y是C++14的工作名称,C++2a对应C++20,C++2b对应C++23(希望如此)。
我想指出的是,对于 非作用域 枚举,C++11 之前和 post,你可以做的是 wrap the enum in a Typesafe Idiom idiom 以指定您想要的尺寸。
(请注意:执行此操作后,包装类型是 class
类型,而不是 enum
或标量类型)
或者,特别是对于 GCC,您可以向枚举添加一个值,该值具有您想要的大小的最大有效值(例如:(uint64_t)-1
用于 64 位枚举)/最大的负值,然后启用 --fshort-enums
标志,这将确保枚举具有适合您的值的最小整数类型。在你的例子中,你需要这样的东西:
enum Enum
{
first,
second,
third,
_dummy = INT_MIN
};
不要引用我的话,但这 应该 可移植到编译器实现 -fshort-enums
或等效编译器标志的所有标准版本,这意味着您可以使用此代码前和 post- C++11.