引用匿名结构本身
typedef struct {
//
} list;
对比
typedef struct list{
//
} list;
我在另一篇文章中读到过(例如使用匿名结构与带有 typedef 的命名结构),其中说这两个几乎是等效的,并且需要后者的唯一时间是在引用结构本身时。
但是,以下内容可以用 clang 和 gcc 编译得很好:
#include <stdio.h>
typedef struct {
struct list *next;
} list;
int main(){
list l;
return 0;
}
上面我有一个匿名结构引用它自己。这是如何编译的?
回答
首先,您的问题中既没有匿名结构。有一些未命名结构的例子。
匿名结构的概念在 C 标准中定义如下(6.7.2.1 结构和联合说明符)
13没有标记的结构类型的无名成员称为匿名结构;没有标记的联合类型的未命名成员称为匿名联合。匿名结构或联合的成员被认为是包含结构或联合的成员。如果包含结构或联合也是匿名的,这将递归地适用。
至于这个声明
typedef struct {
struct list *next;
} list;
然后声明了两种不同的类型:具有别名的未命名结构和类型list的不完整声明struct list。list并且struct list是两种不同的不兼容类型。
例如,如果您将尝试这个简单的程序
#include <stdio.h>
typedef struct {
struct list *next;
} list;
int main(void)
{
list lst1;
list lst2;
lst1.next = &lst2;
return 0;
}
那么编译器将为此语句发出错误
lst1.next = &lst2;
说从不兼容的指针类型“list *”分配给“struct list *”。