奇怪的使用typedef + enum

时间:2013-01-04 00:11:46

标签: c++

  

可能重复:
  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;

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

2 个答案:

答案 0 :(得分:0)

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

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

struct A {};

struct A a;

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

typedef struct {} A;

这在C ++中不再是必要的,所以我得出了他对这个概念的误解的假设。或许作者忘了给它起个名字......

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

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

答案 1 :(得分:0)

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

enum testfoo { enum1, enum2, enum3 );

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

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

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