c语言 - 引用匿名结构本身


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的不完整声明。liststruct 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;

说有一个来自不兼容的指针类型"列表*"的"结构列表*"的赋值。

最新更新