结构中的差异?

时间:2013-12-16 16:50:27

标签: c++ c data-structures

有什么区别:

typedef struct part 
{
   int a;
} Part;

typedef struct 
{
   int a;
} Part;

我知道第二个是“匿名”,但它们有什么不同吗?

3 个答案:

答案 0 :(得分:19)

除了Mike Seymour的回答,这是一个原因的例子:

链接列表例如

// this works
typedef struct part {
    struct part *next;
} Part;

// this doesn't work
typedef struct {
    struct Part *next;
} Part;
// neither this
typedef struct {
    Part *next;
} Part;

答案 1 :(得分:15)

在这两种情况下,您都定义了一种结构类型,以及一种名为Part的类型别名,它引用了该类型。

在第一种情况下,您还定义了结构名称part,因此结构类型在C ++中也可以称为struct partpart

在第二种情况下,结构本身没有名称(因此是“匿名”),并且只能通过类型别名来引用。由于该别名仅在结构定义之后声明,因此结构无法引用自身。

答案 2 :(得分:0)

@MikeSeymur和其他人给出了很好的答案。我想补充一点,没有人明确说明。

在大型项目中,除非绝对必要,否则将标题保持在最小程度并避免#include - 其他标题非常重要。

假设您的结构是在某个头文件part.h中定义的。已定义的命名结构类型Part允许使用您的代码的其他人通过使用所谓的“前向声明”跳过 #include“part.h”

//file foo.h knows struct Part "by name only"
struct Part;
void foo(struct Part* p); //in pure C, works for C++ too
void bar(Part* p); //in C++

在匿名结构的情况下,文件foo.h 被强制 #include 文件part.h。

//file foo.h forced to #include part.h because "part" is typedef of anonymous type
#include "part.h"
void foo(part* p); 

在遗留代码中,这些匿名类型经常导致每个标头包含许多其他标头的情况,维护和代码重用成为一场噩梦。

一般情况下,我建议不要使用匿名类型,除非你确切地知道你在做什么(有很多情况下它们完全没问题,例如作为其他类型的实现成员)。