【问题标题】:Specifying enum size in C++0x在 C++0x 中指定枚举大小
【发布时间】:2021-01-20 08:55:23
【问题描述】:

我对@9​​87654324@ 中的非范围枚举行为有疑问。我已经阅读了有关堆栈溢出和其他页面的多个问题和文章。

我使用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 特征吗?

我在StackOverflow 上找到了一个答案,声称如果我们在定义之前声明它们,我们可以定义具有大小的范围枚举。该答案提供了Wiki 链接。但是C++11 的wiki 链接已更新,C++03 的引用已被删除。

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

【问题讨论】:

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

标签: c++ c++03


【解决方案1】:

指定枚举的大小不是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++0x 不一定是实验性实现。最新版本的 gcc 仍然接受它并且 afaik 它只是 C++11 的同义词
  • 实际上正如您所写的那样,它没有错,但可能会产生误导。我说的是标志,当您说“如果您使用“C++0x”..”时,您指的是我认为的实现
  • @largest_prime_is_463035818 我添加了说明。
【解决方案2】:

我想指出,对于 非作用域 枚举,无论是 C++11 之前还是之后,你可以做的是 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 或等效编译器标志的所有标准版本中移植,这意味着您可以在前后使用此代码C++11。

【讨论】:

  • 写“应该是可移植的”,-fshort-enum 选项强制 GCC 做出在任何 C++ 标准中都是合法的选择。 INT_MIN 确保这个选择是 int,同样不管 C++ 标准。
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 2010-10-25
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
相关资源
最近更新 更多