2012-09-13 49 views

回答

1

结构都应该有一个名字:

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; 
2

在C和C++中,您声明的任何struct都可以称为struct GOOD。您也可以声明没有名称的匿名结构,如第一个示例中所述。可以是typedef'd给它一个别名在第一个示例中,您只需将名称GOOD(不含struct)命名为匿名结构。在第二个示例中,您的结构只能以struct GOOD访问。第三,您可以通过GOODstruct GOOD访问它。

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

+1

第三个例子允许'struct tagGOOD'或'GOOD',但不是'struct GOOD'。 – mkb

+0

感谢朋友,它帮助了很多:)它确实。 –

+0

作为第一个和(几乎)正确的+1 ... –

2

在我阅读过的所有代码中,我已经看到了所有这些变体的使用。我刚刚在VS2010中检查过,他们似乎是相同的。我可以告诉你的是,typedef关键字在C中是必需的,但不再在C++中使用。

+0

正确答案。当C和C++发生分歧时,或者老师教C,并且这个问题被错误标记,那么老师会陷入〜1992年。 – MSalters

+0

C中的typedef是**不是必需的。它被(和)用作方便,所以你不必一直说'struct foo'。 –

0

定义1:

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

定义2:

定义一个(空)STRUCT命名GOOD。在C和C++中,这可以被称为struct GOOD,而在C++中,这可以被称为GOOD

定义3:

定义一个(空)STRUCT名为tagGOOD和一个typedef命名GOOD。在C和C++中,该结构可以被称为struct tagGOODGOOD,并且在C++中可以被称为tagGOOD

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

1

如果你谈论的是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来引用它。