结构的结构?

时间:2012-09-13 02:16:05

标签: c++ struct typedef

  

可能重复:
  Difference between 'struct' and 'typedef struct' in C++?

有人可以解释以下Struct结构

之间的区别
typedef struct
{
}GOOD;

&

struct GOOD
{
};

&

typedef struct tagGOOD
{
}GOOD;

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

5 个答案:

答案 0 :(得分:2)

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

任何类型都可以typedef给它一个替代名称。在第一个示例中,您只是将名称GOOD(没有struct)提供给匿名结构。在第二个示例中,您的结构只能作为struct GOOD访问。在第三种情况下,您可以GOODstruct 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 tagGOODGOOD,在C ++中,这可以称为tagGOOD

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