当前位置: 首页 > 知识库问答 >
问题:

为什么要在结构中放置枚举,然后使用typedef名称?

左丘涵畅
2023-03-14
struct Foo
{
    enum FType
    {
        TypeA,
        TypeB,
        Type_MAX
    };
};
typedef Foo::FType FooType;
[...]
FooType m_type;
enum FooType
{
    TypeA,
    TypeB,
    Type_MAX
};
[...]
FooType m_type;

我不能问原来的程序员,因为他们已经被重新分配了,而且原来我们公司指定的主题专家是,事实上,我。

如果有帮助的话,这段代码已经在不同的时间使用许多版本的MSVC、gcc和clang编译过,适用于不同的目标平台...全部在C++11之前。

有人能明白为什么要这么做吗?提前道歉,如果答案是一些琐碎的事情。

共有1个答案

华睿识
2023-03-14

普通旧枚举的问题是枚举数成为定义枚举的作用域中的名称。因此,你可以说,例如,

FooType m_type;
m_type = TypeA;

如果还定义了类名typea,则会发生冲突。将枚举放入类中意味着您必须使用范围限定符来获取名称,这将消除冲突。这也意味着你必须写

FooType m_type;
m_type = FooType::TypeA;

因为以前的版本是无效的。

此问题的一个较新的解决方案是限定范围的枚举:

enum class FooType {
    TypeA,
    TypeB,
    Type_MAX
};

现在你可以说

FooType m_type;
m_type = FooType::TypeA;

但不是

m_type = TypeA;
int i = FooType::TypeA;
int i = static_cast<int>(FooType::TypeA);
 类似资料:
  • 问题内容: 如果您在枚举api中查看该方法,则会显示: 返回此枚举常量的名称,该名称与在其枚举声明中声明的完全相同。大多数程序员应该优先使用toString方法,因为toString方法可能返回更用户友好的名称。此方法主要设计用于在特殊情况下正确性取决于获得确切名称的特殊情况,具体名称在各个发行版本之间不会有所不同。 为什么更好用?我的意思是当name()已经是final时,toString可能会

  • 问题内容: 我是一名即将毕业的计算机科学专业的学生,​​在我的整个编码生涯中,我发现很少使用枚举的实例,除了典型的情况(例如代表标准纸牌的面孔)外,还使用了枚举。 您是否知道在日常编码中使用枚举的任何巧妙方法? 为什么枚举如此重要,在什么情况下应该能够确定建立枚举是最佳方法? 问题答案: 这些是主要的论点,以及短的例子。 的情况 从Java 6开始,是一个凌乱类的示例,该类可以从使用中受益匪浅(除

  • 我听到一些人建议在C++中使用枚举类,因为它们的类型安全。 但这到底意味着什么呢?

  • 问题内容: 我很清楚Java中枚举的高级用法。对我来说,许多区别于普通班和告诉他们需要的观点也很清楚。 谁能举一些带有高级枚举示例代码的实际示例?可以清楚地阐述一下 我们应该避免使用类,而应该使用枚举 。 请不要混淆。我不是在问如何使用枚举或枚举的用途是什么。关于此有很多问题和答案。我正在寻找一些实时/实时/实际的例子,我们应该避免任何其他数据类型或类。 问题答案: 试试这个例子: 用法:

  • 问题内容: 通常,在switch语句中不需要默认值。但是,在以下情况下,仅当我取消注释默认语句时,代码才能成功编译。有人可以解释为什么吗? 问题答案: 您必须取消注释的原因是您的函数说它返回一个,但是如果您只为定义了标签,那么如果您传入其他任何内容,该函数将不会返回值。Java要求所有声明它们返回值的函数实际上在所有可能的控制路径上都返回一个值,并且在您的情况下,编译器不确信所有可能的输入都返回了

  • 问题内容: 在golang中不应占用任何内存空间。但是这两个结构具有不同的大小。 那么,为什么事情在这里重要呢? 顺便说一下,我使用method检查结构大小。请参阅完整示例。 问题答案: 这是由于 棘手的 填充。 首先,请允许我稍微重命名结构和字段,以便于讨论它们: 当然,这不会更改大小和偏移量,可以在Go Playground上进行验证: 类型值的大小为零,因此完全不为第一个字段()保留任何空间