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;
说有一个来自不兼容的指针类型"列表*"的"结构列表*"的赋值。