0

可能重复:
C++ 中“struct”和“typedef struct”之间的区别?

有人可以解释以下结构定义之间的区别吗

typedef struct
{
}GOOD;

&

struct GOOD
{
};

&

typedef struct tagGOOD
{
}GOOD;

我的老师使用了最后一个示例,但我真的不知道他为什么在结构名称上使用“标签”(如果是名称),有人可以说清楚吗?

4

5 回答 5

2

在 C 和 C++ 中,struct您使用名称声明的任何内容都可以称为struct GOOD. 您还可以声明没有名称的匿名结构,如第一个示例中所做的那样。

任何类型都可以typedef给它一个备用名称。在第一个示例中,您只是将名称GOOD(不带struct)赋予匿名结构。在第二个示例中,您的结构只能以struct GOOD. 在第三个中,您可以使用GOOD或访问它struct GOOD

这三个选项都是合法的,使用哪一个是风格问题。

于 2012-09-13T02:21:22.020 回答
2

在我多年来阅读的所有代码中,我看到了所有这些变体的使用。我刚刚检查了 VS2010,它们似乎是等价的。我可以告诉你的是 typedef 关键字曾经在 C 中是必需的,但在 C++ 中不再需要。

于 2012-09-13T02:21:51.840 回答
1

结构应该有一个名字:

struct StructName {
   // stuff
};

Typedefs 接受一个类型并给它一个名字:

typedef SomeType NameYouWannaGiveThatType;

第三个例子结合了这些。

该示例是一个未命名的结构,一些编译器对此感到不安。

第二个例子是一个命名的结构,但传统上你不能在不包括单词结构的情况下引用它。 例如

struct MyStruct {
    //...
};

MyStruct iffy;          // Not allowed in C, in my experience anyway
struct MyStruct good;   // No problem.

我还没有发现这在 C++ 中是个问题,但我敢肯定有人知道 C++ 规范,并且会给你一个更好的答案。不管怎样,你可以用 typedef 解决这个问题。

typedef MyStruct { /* etc */ } MyStruct;

MyStruct s;

就个人而言,这可能只是风格问题,我宁愿不使用相同的名称:

typedef MyStruct { /* etc */ } SMyStruct;
于 2012-09-13T02:25:28.860 回答
1

如果您在谈论 C++,我相信 typedef 并不是真正需要的。这个故事实际上来自 C.

在 C 中,当我声明

struct GOOD_STRUCT {
   ...
}

当我想声明这个结构的变量时,我需要做

struct GOOD_STRUCT good;

为了有更好的编码风格和可读性,人们习惯在这个上使用 typedef:

typedef GOOD_STRUCT GOOD;

所以你可以做

GOOD good;

将两者结合起来,人们过去常常做

typedef struct GOOD_STRUCT {
   ...
} GOOD;

或者

typedef struct {
   ...
} GOOD;

但是,在 C++ 中,不再需要它。一旦你有 declare struct GOOD,你已经可以GOOD直接引用它了。

于 2012-09-13T02:28:26.433 回答
0

定义 1:

定义一个匿名(空)结构,并给它一个 typedef GOOD。这种类型可以简称为GOOD将来。

定义 2:

定义一个名为 的(空)结构GOOD。在 C 和 C++ 中,这可以称为struct GOOD,而在 C++ 中,这可以称为GOOD

定义 3:

定义一个名为的(空)结构体tagGOOD和一个名为 的 typedef GOOD。在 C 和 C++ 中,结构体可以称为struct tagGOODand GOOD,而在 C++ 中,结构体可以称为tagGOOD.

根据我的经验,定义 3 往往是 C 代码中最常见的。人们往往不太喜欢匿名结构,所以他们给结构命名,但他们也不喜欢struct在引用类型时使用关键字,所以他们也给它一个 typedef。在 C++ 中,typedef 形式是毫无意义的。

于 2012-09-13T02:23:39.987 回答