有人可以解释以下结构定义之间的区别吗
typedef struct
{
}GOOD;
&
struct GOOD
{
};
&
typedef struct tagGOOD
{
}GOOD;
我的老师使用了最后一个示例,但我真的不知道他为什么在结构名称上使用“标签”(如果是名称),有人可以说清楚吗?
有人可以解释以下结构定义之间的区别吗
typedef struct
{
}GOOD;
&
struct GOOD
{
};
&
typedef struct tagGOOD
{
}GOOD;
我的老师使用了最后一个示例,但我真的不知道他为什么在结构名称上使用“标签”(如果是名称),有人可以说清楚吗?
在 C 和 C++ 中,struct
您使用名称声明的任何内容都可以称为struct GOOD
. 您还可以声明没有名称的匿名结构,如第一个示例中所做的那样。
任何类型都可以typedef
给它一个备用名称。在第一个示例中,您只是将名称GOOD
(不带struct
)赋予匿名结构。在第二个示例中,您的结构只能以struct GOOD
. 在第三个中,您可以使用GOOD
或访问它struct GOOD
。
这三个选项都是合法的,使用哪一个是风格问题。
在我多年来阅读的所有代码中,我看到了所有这些变体的使用。我刚刚检查了 VS2010,它们似乎是等价的。我可以告诉你的是 typedef 关键字曾经在 C 中是必需的,但在 C++ 中不再需要。
结构应该有一个名字:
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;
如果您在谈论 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
直接引用它了。
定义 1:
定义一个匿名(空)结构,并给它一个 typedef GOOD
。这种类型可以简称为GOOD
将来。
定义 2:
定义一个名为 的(空)结构GOOD
。在 C 和 C++ 中,这可以称为struct GOOD
,而在 C++ 中,这可以称为GOOD
。
定义 3:
定义一个名为的(空)结构体tagGOOD
和一个名为 的 typedef GOOD
。在 C 和 C++ 中,结构体可以称为struct tagGOOD
and GOOD
,而在 C++ 中,结构体可以称为tagGOOD
.
根据我的经验,定义 3 往往是 C 代码中最常见的。人们往往不太喜欢匿名结构,所以他们给结构命名,但他们也不喜欢struct
在引用类型时使用关键字,所以他们也给它一个 typedef。在 C++ 中,typedef 形式是毫无意义的。