有什么区别:
typedef struct part
{
int a;
} Part;
和
typedef struct
{
int a;
} Part;
我知道第二个是“匿名”,但它们有什么不同吗?
答案 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 part
或part
。
在第二种情况下,结构本身没有名称(因此是“匿名”),并且只能通过类型别名来引用。由于该别名仅在结构定义之后声明,因此结构无法引用自身。
答案 2 :(得分:0)
在大型项目中,除非绝对必要,否则将标题保持在最小程度并避免#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);
在遗留代码中,这些匿名类型经常导致每个标头包含许多其他标头的情况,维护和代码重用成为一场噩梦。
一般情况下,我建议不要使用匿名类型,除非你确切地知道你在做什么(有很多情况下它们完全没问题,例如作为其他类型的实现成员)。