2

可能重复:
typedef 声明中的 typedef-name 是可选的吗?

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

typedef enum testfoo
{
    enum1,
    enum2,
    enum3
};

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

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

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

4

2 回答 2

0

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

enum testfoo { enum1, enum2, enum3 );

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

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

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

于 2013-01-04T00:19:01.430 回答
0

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

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

struct A {};

struct A a;

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

typedef struct {} A;

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

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

typedef struct A {}; // simply a class-declaration, generates a warning
于 2013-01-04T00:15:35.220 回答