可能重复:
Difference between 'struct' and 'typedef struct' in C++?结构的结构?
有人可以解释什么是
typedef struct
{
}GOOD;
&
struct GOOD
{
};
&
typedef struct tagGOOD
{
}GOOD;
我的老师用最后一个例子结构的以下定义之间的差别,但我不”不知道为什么他在结构体名称上使用了“标签”(如果它是名称),请问有人能说清楚吗?
可能重复:
Difference between 'struct' and 'typedef struct' in C++?结构的结构?
有人可以解释什么是
typedef struct
{
}GOOD;
&
struct GOOD
{
};
&
typedef struct tagGOOD
{
}GOOD;
我的老师用最后一个例子结构的以下定义之间的差别,但我不”不知道为什么他在结构体名称上使用了“标签”(如果它是名称),请问有人能说清楚吗?
结构都应该有一个名字:
struct StructName {
// stuff
};
类型定义采取类型,并给它一个名字:
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和C++中,您声明的任何struct
都可以称为struct GOOD
。您也可以声明没有名称的匿名结构,如第一个示例中所述。可以是typedef
'd给它一个别名在第一个示例中,您只需将名称GOOD
(不含struct
)命名为匿名结构。在第二个示例中,您的结构只能以struct GOOD
访问。第三,您可以通过GOOD
或struct GOOD
访问它。
所有三个选项都是合法的,哪一个使用是风格问题。
在我阅读过的所有代码中,我已经看到了所有这些变体的使用。我刚刚在VS2010中检查过,他们似乎是相同的。我可以告诉你的是,typedef关键字在C中是必需的,但不再在C++中使用。
正确答案。当C和C++发生分歧时,或者老师教C,并且这个问题被错误标记,那么老师会陷入〜1992年。 – MSalters
C中的typedef是**不是必需的。它被(和)用作方便,所以你不必一直说'struct foo'。 –
定义1:
定义一个匿名(空)结构,并给出了它的GOOD
一个typedef。这种类型在未来可简称为GOOD
。
定义2:
定义一个(空)STRUCT命名GOOD
。在C和C++中,这可以被称为struct GOOD
,而在C++中,这可以被称为GOOD
。
定义3:
定义一个(空)STRUCT名为tagGOOD
和一个typedef命名GOOD
。在C和C++中,该结构可以被称为struct tagGOOD
和GOOD
,并且在C++中可以被称为tagGOOD
。
定义3在我的经验中往往是C代码中最常见的。人们往往不喜欢匿名结构,所以他们给结构一个名字,但他们也不喜欢在引用类型时使用关键字struct
,所以他们也给它一个typedef。在C++中,typedef形式是毫无意义的。
如果你谈论的是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++中,它不再需要。一旦你声明struct GOOD
,你可以直接通过GOOD
来引用它。
第三个例子允许'struct tagGOOD'或'GOOD',但不是'struct GOOD'。 – mkb
感谢朋友,它帮助了很多:)它确实。 –
作为第一个和(几乎)正确的+1 ... –