[英]Declaring a structure: typedef struct name name;
我们都知道如何在C中声明一个结构:
struct Label1{ /* variables */ } Label2; // As I learned
但我想知道为什么这段代码在没有声明'struct name'的情况下工作:
typedef struct name s_name;
或者实际上是键入代码
struct name;
是说我将'struct name'声明为void结构或类似的东西?
代码示例:
typedef struct Data Data;
struct Data{ /*variables*/ };
如果在第一行中struct data被声明为void one,那么在第二行中它就像我用成员重新声明它一样。
对于这一点有什么解释?
就像是:
struct MyStruct;
被称为前瞻性参考。 它创建了一个不完整的类型,告诉编译器会有一个类型的名称(它是一个结构 - 它同样适用于联合),细节“稍后跟进”。 在完成类型之前,您无法定义变量。
typedef struct MyStruct MyType;
只需将类型名称定义为该结构。 这仍然是一个不完整的类型。
但是,您可以使用指向不完整类型的指针:
MyType *my_t_pointer;
struct MyStruct *my_s_pointer;
当您提供完整声明“完成”类型时,这对于具有指向相同类型对象的指针的结构非常有用:
struct MyStruct {
struct MyStruct *next;
};
实际上,这是为列表,树和所有其他递归数据结构创建节点的唯一方法。 这是C程序的主要部分(有时是隐藏的)。
此外,此机制用于隐藏实现细节。 标头中的函数只需知道存在的结构来接受/传递指针。 使用这些函数不需要知道结构的细节(但是这样它不能分配它,因此模块必须涵盖需要知道结构细节的所有方面)。 完整声明仅在模块的实现文件中。 这些指针被称为“不透明”,因为人们不能“透视”,即访问结构的字段,因为它们根本不为人所知。
my_module.h:
struct MyStruct;
extern void my_init(struct MyStruct *obj);
my_module.c:
struct MyStruct {
int f1;
...
};
my_init(struct MyStruct *obj)
{
...
}
typedef将s_name声明为struct name的别名,以便您可以声明变量,例如:
s_name *sptr;
这条线
struct name;
声明存在名为name的结构类型而不定义其内容。 这通常是为了能够将变量声明为结构类型的指针 。 在定义之前,您不能声明实际结构类型的变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.