在以下方面有什么区别:
typedef struct part
{
int a;
} Part;和
typedef struct
{
int a;
} Part;我知道第二个是“匿名”,但它们不同吗?
发布于 2013-12-16 16:58:00
除了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;发布于 2013-12-16 16:53:07
在这两种情况下,您都定义了一个结构类型,以及一个名为Part的类型别名,它引用了该类型。
在第一种情况下,您还定义了一个结构名part,因此结构类型也可以称为struct part,或者仅在C++中称为part。
在第二种情况下,结构本身没有名称(因此是“匿名”),只能由类型别名引用。由于该别名仅在结构定义之后声明,因此该结构不能引用自身。
发布于 2013-12-16 17:38:54
除了@EoiFirst的答案,
typedef struct part
{
int a;
struct part *next;
} Part;这是有效的,因为next是指向struct part的指针,因此它具有指针类型的大小。
C是一种类型化语言,所以编译器知道next的类型,在完全定义struct part之后,它将能够确定下面的代码是有效的。它知道next是指向struct part的指针,它有一个字段int a。
void test(struct part *p) {
if (p != NULL && p->next != NULL) {
printf("%d\n", p->next->a); // this is valid
}
}你可以宣布
typedef struct part
{
int a;
void *next;
} Part;struct part的大小仍将与上面声明的大小相同。现在,next是指向任何东西的指针,上面使用test()的代码会编译错误。
warning: dereferencing 'void *' pointer
error: request for member 'a' in something not a structure or union您需要编写printf("%d\n", ((struct part *) p->next)->a);
而且,你也不能声明这个,
typedef struct part
{
int a;
struct part nested;
} Part;您将得到一个编译器错误。
error: field 'nested' has incomplete typehttps://stackoverflow.com/questions/20616206
复制相似问题