引用匿名结构本身

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 listlist并且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 *”。


以上是引用匿名结构本身的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>