关于c ++:结构的结构?

The structure of a struct?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Difference between 'struct' and 'typedef struct' in C++?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct
{
}GOOD;

&

struct GOOD
{
};

&

typedef struct tagGOOD
{
}GOOD;

我的老师用了最后一个例子,但我真的不知道为什么他在结构名上使用了一个"标记"(如果它是名称),有人能说清楚吗?


在我多年来阅读的所有代码中,我都看到了使用的所有这些变体。我刚刚登记了VS2010,它们似乎是等效的。我可以告诉你的是,TyPulf关键字在C中是必需的,但是不再是C++中的。


在C和C++中,用一个名称声明的任何EDCOX1(0)都可以被称为EDCOX1(1)。您还可以声明没有名称的匿名结构,如第一个示例中所做的那样。

任何类型都可以是typedef,并给它一个备用名称。在第一个示例中,只需将名称GOOD(不带struct)赋给匿名结构。在第二个示例中,只能以struct GOOD的形式访问结构。在第三种情况下,您可以将其作为GOODstruct GOOD访问。

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


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

在C中,当我声明

1
2
3
struct GOOD_STRUCT {
   ...
}

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

1
struct GOOD_STRUCT good;

为了获得更好的编码风格和可读性,人们习惯于在以下内容上进行typedef:

1
typedef GOOD_STRUCT GOOD;

所以你可以这样做

1
GOOD good;

为了把两者结合起来,人们过去常常这样做

1
2
3
typedef struct GOOD_STRUCT {
   ...
} GOOD;

1
2
3
typedef struct {
   ...
} GOOD;

然而,在C++中,不再需要它了。申报struct GOOD后,可以直接通过GOOD转介。


结构应该有一个名称:

1
2
3
struct StructName {
   // stuff
};

typedef接受一个类型并给它一个名称:

1
typedef SomeType NameYouWannaGiveThatType;

第三个例子结合了这些。

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

第二个例子是命名结构,但是传统上,如果不包含单词struct,就不能引用它。如

1
2
3
4
5
6
struct MyStruct {
    //...
};

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

我还没有发现这是C++中的一个问题,但我确信有些人在后面知道C++规范,会给你一个更好的答案。总之,你可以用typedef绕过这个问题。

1
2
3
typedef MyStruct { /* etc */ } MyStruct;

MyStruct s;

就个人而言,这可能只是一个风格问题,我不喜欢使用相同的名字:

1
typedef MyStruct { /* etc */ } SMyStruct;

定义1:

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

定义2:

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

定义3:

定义名为tagGOOD的(空)结构和名为GOOD的typedef。在C和C++中,结构可以称为EDCOX1,15,EDCX1,3,并且在C++中,这可以被称为EDCOX1×13。

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