gpt4 book ai didi

c - 声明结构 : typedef struct name name;

转载 作者:太空狗 更新时间:2023-10-29 17:01:27 25 4
gpt4 key购买 nike

我们都知道如何在 C 中声明结构:

struct Label1{ /* variables */ } Label2; // As I learned

但我想知道为什么这段代码可以在不声明“结构名称”的情况下运行:

typedef struct name s_name;

或者事实上,输入代码

struct name;

意思是我将“struct name”声明为 void 结构或类似的东西?

代码示例:

typedef struct Data Data;
struct Data{ /*variables*/ };

如果在第一行中将 struct Data 声明为 void,那么在第二行中就像我用成员重新声明它一样。

这个点的解释是什么?

最佳答案

类似于:

struct MyStruct;

称为前向引用。它创建了一个不完整的类型,并告诉编译器将有一个该名称的类型(它是一个结构——它同样适用于 union ),以及“稍后跟进”的细节。在完成类型之前,您无法定义此类类型的变量。

typedef struct MyStruct MyType;

只会将类型名称定义为该结构。这仍然是一个不完整的类型。

但是,您可以使用指向不完整类型的指针:

MyType *my_t_pointer;
struct MyStruct *my_s_pointer;

当您提供完整声明时,这对于结构具有指向相同类型对象的指针很有用,“完成”类型:

struct MyStruct {
struct MyStruct *next;
};

实际上,这是为列表、树和所有其他递归数据结构创建节点的唯一方法。这是 C 程序的主要部分(有时是隐藏的)。

此外,此机制用于隐藏实现细节。 header 中的函数只需要知道结构的存在就可以获取/传递指向它的指针。这些函数的使用不需要知道结构的细节(但是这样它不能分配它,所以模块必须覆盖所有需要知道结构细节的方面)。完整的声明只在模块的实现文件中。这些指针被称为“不透明”,因为人们无法“透视”,即访问结构的字段,因为它们根本不为人所知。

我的模块.h:

struct MyStruct;

extern void my_init(struct MyStruct *obj);

我的模块.c:

struct MyStruct {
int f1;
...
};

my_init(struct MyStruct *obj)
{
...
}

关于c - 声明结构 : typedef struct name name;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30417689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com