可能重复:
Difference between 'struct' and 'typedef struct' in C++?
有人可以解释以下Struct结构
之间的区别typedef struct
{
}GOOD;
&
struct GOOD
{
};
&
typedef struct tagGOOD
{
}GOOD;
我的老师使用的是最后一个例子,但我真的不知道他为什么在结构名称上使用“标签”(如果是它的名字),有人能说清楚吗?
答案 0 :(得分:2)
在C和C ++中,您使用名称声明的任何struct
都可以称为struct GOOD
。您还可以声明没有名称的匿名结构,如第一个示例中所述。
任何类型都可以typedef
给它一个替代名称。在第一个示例中,您只是将名称GOOD
(没有struct
)提供给匿名结构。在第二个示例中,您的结构只能作为struct GOOD
访问。在第三种情况下,您可以GOOD
或struct GOOD
访问它。
所有这三个选项都是合法的,使用哪一个是风格问题。
答案 1 :(得分:2)
在我多年来阅读的所有代码中,我已经看到使用了所有这些变体。我刚刚检查了VS2010,它们似乎相当。我可以告诉你的是,在C中需要使用typedef关键字,但不再使用C ++。
答案 2 :(得分:1)
结构应该有一个名称:
struct StructName {
// stuff
};
Typedef采用一种类型并为其命名:
typedef SomeType NameYouWannaGiveThatType;
第三个例子结合了这些。
该示例是一个未命名的结构,一些编译器对此感到不安。
第二个例子是一个命名结构,但如果不包含单词struct,你传统上不能引用它。 例如
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;
答案 3 :(得分:1)
如果你在谈论C ++,我相信并不真正需要typedef。这个故事实际上来自C。
当我宣布时,在C中
struct GOOD_STRUCT {
...
}
当我想声明这个结构的变量时,我需要做
struct GOOD_STRUCT good;
为了获得更好的编码风格和可读性,人们习惯于对此进行输入:
typedef GOOD_STRUCT GOOD;
所以你可以做到
GOOD good;
要将两者结合起来,人们过去常常做
typedef struct GOOD_STRUCT {
...
} GOOD;
或
typedef struct {
...
} GOOD;
但是,在C ++中,不再需要它。声明struct GOOD
后,您可以直接通过GOOD
引用它。
答案 4 :(得分:0)
定义1:
定义一个匿名(空)结构,并为其赋予typedef GOOD
。此类型在将来可简称为GOOD
。
定义2:
定义名为GOOD
的(空)结构。在C和C ++中,这可以称为struct GOOD
,在C ++中,这可以称为GOOD
。
定义3:
定义名为tagGOOD
的(空)结构和名为GOOD
的typedef。在C和C ++中,结构可以称为struct tagGOOD
和GOOD
,在C ++中,这可以称为tagGOOD
。
根据我的经验,定义3往往是C代码中最常见的。人们往往不喜欢匿名结构,所以他们给结构命名,但他们也不喜欢在引用类型时使用struct
关键字,所以他们也给它一个typedef。在C ++中,typedef形式毫无意义。