【问题标题】:Strange usage of typedef + enum [duplicate]typedef + enum 的奇怪用法
【发布时间】:2013-01-04 00:11:46
【问题描述】:

可能重复:
Is the typedef-name optional in a typedef declaration?

我在 Visual Studio 2008 上看到了这个:

typedef enum testfoo
{
    enum1,
    enum2,
    enum3
};

通常以这种方式使用 typedef 的 C 风格需要一个额外的部分(名称):

typedef enum testfoo
{
    enum1,
    enum2,
    enum3
} testfoo_name;

前一个例子在做什么?奇怪的是它可以编译,但不确定它实际定义了什么。

【问题讨论】:

  • 简短回答,typedef 在第一个示例中完全没有意义。

标签: c++


【解决方案1】:

有区别。第二个为enum 创建别名,但第一个没有。第一个示例中的 typedef 实际上并没有做任何事情。这在 GCC 中给了我一个警告,所以我怀疑你可以把它拿出来。

在 C 中,typedef 结构和枚举很常见,以避免使用结构或枚举名称进行实例化。例如:

struct A {};

struct A a;

为了缩短这一点,typedef 可以解决问题:

typedef struct {} A;

这在 C++ 中不再需要,所以我推导出他对这个概念的误解。又或者作者忘了给它起个名字……

在使用类或结构时也会发生同样的事情:

typedef struct A {}; // simply a class-declaration, generates a warning

【讨论】:

  • @CarlNorum:如果您要创建一个 typedef(即使在 C 中也不是必需的),您不妨为 typedef 名称和标签使用相同的标识符:@987654328 @ - 问题中的代码没有这样做。在 C 中,这使您可以将类型称为 enum testfootestfoo。在 C++ 中,它做同样的事情,只是即使没有 typedef 也会发生。
  • @Keith - 我的评论是参考此答案的先前版本。它不再有意义 - 我会删除它。
【解决方案2】:

第一个例子只是一个无用的typedef。我相信它在语法上是合法的,但它没有为类型定义提供名称,所以它相当于:

enum testfoo { enum1, enum2, enum3 );

在 C 中,这会创建一个名为 enum testfoo 的类型;通常(但不是必须)使用 typedef 来允许将类型称为 testfoo

在 C++ 中,类型可以称为 enum testfootestfoo,即使没有 typedef。

我怀疑有人对规则感到困惑,看到该类型(在 C++ 中)可以称为 testfoo,并错误地认为这是因为 typedef

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多