C++ 在C+中指定枚举大小+;0x

C++ 在C+中指定枚举大小+;0x,c++,c++03,C++,C++03,我对C++03中的非作用域枚举行为有疑问。我读过许多关于堆栈溢出和其他页面的问题和文章 我使用的是C++0x标准,运行的是gcc4.6.4 我可以用大小(比如int)定义非作用域枚举。提及 #包括 枚举:int; 枚举枚举:int { 第一, 第二 第三 }; int main() { 整数=第一; 开关(数字) { 案例一:突破; 案例二:断裂; 默认:中断; } 返回0; } 指定枚举的大小是否为C++11功能 我找到了一个答案,即如果我们在定义前声明作用域枚举,就可以定义大小为的作用域枚

我对
C++03
中的非作用域枚举行为有疑问。我读过许多关于堆栈溢出和其他页面的问题和文章

我使用的是
C++0x
标准,运行的是
gcc4.6.4

我可以用大小(比如int)定义非作用域枚举。提及

#包括
枚举:int;
枚举枚举:int
{
第一,
第二
第三
};
int main()
{
整数=第一;
开关(数字)
{
案例一:突破;
案例二:断裂;
默认:中断;
}
返回0;
}
指定枚举的大小是否为
C++11
功能

我找到了一个答案,即如果我们在定义前声明作用域枚举,就可以定义大小为的作用域枚举。这个答案提供了联系。但是,
C++11
的wiki链接已被更新,
C++03
的引用已被删除

那么,我们能否在
C++03
中定义
enum
的大小?代码(粘贴在上面)是有效的
C++03
代码吗?如果我们可以定义,那么它会影响
enum
的底层类型吗

指定枚举的大小不是C++11特性吗

您似乎指的是指定基础类型。是的,它是在C++11中引入的

那么,我们可以在C++03中定义枚举的大小吗

不,我们不能

代码(粘贴在上面)是有效的C++03代码吗

不,不是

我使用的是C++0x标准

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特性吗

您似乎指的是指定基础类型。是的,它是在C++11中引入的

那么,我们可以在C++03中定义枚举的大小吗

不,我们不能

代码(粘贴在上面)是有效的C++03代码吗

不,不是

我使用的是C++0x标准

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之前还是之后,您可以做的是指定所需的大小

(请考虑:完成此操作后,包装的类型是
类型,而不是
枚举
或标量类型)

或者,对于GCC,您可以向枚举添加一个值,该值具有所需大小的最大有效值(例如:
(uint64位枚举的uint64_t)-1
)/最大负值,然后启用
--fshort enums
标志,这将确保枚举具有适合您的值的最小整数类型。在您的示例中,您需要以下内容:

enum Enum
{
    first,
    second,
    third,
    _dummy = INT_MIN
};

请不要引用我的话,但这应该可以移植到编译器实现
-fshort enum
或等效编译器标志的标准的所有版本中,这意味着您可以在C++11之前和之后使用此代码。

我想指出,对于非范围枚举,C++11之前和之后,您可以做的是指定所需的大小

(请考虑:完成此操作后,包装的类型是
类型,而不是
枚举
或标量类型)

或者,对于GCC,您可以向枚举添加一个值,该值具有所需大小的最大有效值(例如:
(uint64位枚举的uint64_t)-1
)/最大负值,然后启用
--fshort enums
标志,这将确保枚举具有适合您的值的最小整数类型。在您的示例中,您需要以下内容:

enum Enum
{
    first,
    second,
    third,
    _dummy = INT_MIN
};

请不要引用我的话,但这应该可以移植到编译器实现
-fshort enum
或等效编译器标志的所有标准版本中,这意味着您可以在C++11之前和之后使用这段代码。

如果使用C++0x,您将启用GCC能够实现的任何C++11功能。这就是C++0x的目的(当时人们仍然认为C++11将在2010年之前完成)。C++11应该比11早一点,这就是为什么编译器选项在最后确定之前被称为
C++0x
。谢谢评论。现在很清楚,
C++0x
是基于
C++
的草稿版本<代码>C++11在委员会将其作为标准后。如果您使用C++0x,您将启用GCC迄今为止能够实现的任何C++11功能。这就是C++0x的目的(当时人们仍然认为C++11将在2010年之前完成)。C++11应该比11早一点,这就是为什么编译器选项在最后确定之前被称为
C++0x
。谢谢评论。现在很清楚,
C++0x
是基于
C++
的草稿版本
C++11
在委员会将其作为标准之后。C++0x不一定是标准