Nit*_*apa 4 c structure user-defined-data-types
例如考虑:
struct strct
{
data member_1;
data member_2;
......
};
Run Code Online (Sandbox Code Playgroud)
编译器何时识别
struct strct
Run Code Online (Sandbox Code Playgroud)
作为数据类型?是在执行该行之后
struct strct
Run Code Online (Sandbox Code Playgroud)
?或者在遇到结构定义的右括号之后?
小智 8
声明不是"执行"的.
看完之后
struct strct {
Run Code Online (Sandbox Code Playgroud)
编译器识别struct strct为不完整类型,它是一种不知道大小的类型.由于您可以使用指向不完整类型的指针,因此您可以编写如下内容:
struct strct {
struct strct *next; // <- allowed, a pointer doesn't need the size of the object pointed to
int foo;
};
Run Code Online (Sandbox Code Playgroud)
一旦结构声明的"主体"完成,struct strct就是一个完整的类型,所以你可以声明那个类型的变量(必须知道它的大小).
旁注:您可以在标签后用您的声明停止,如下所示:
struct strct;
Run Code Online (Sandbox Code Playgroud)
因此,让编译器知道不完整的类型 struct strct.这也称为前瞻性声明.当然,只有在某个地方(也可能是模块中的私有)完成声明时才有意义.这用于在C中实现OOP代码时的信息隐藏.例如,您只需公开声明此类内容:
struct strct;
struct strct *strct_create(void);
strct_foo(struct strct *self);
strct_bar(struct strct *self, int x);
[...]
Run Code Online (Sandbox Code Playgroud)
并在文件中完整声明struct strct实现这些功能
该名称一struct strct出现在代码中就可以查看.这允许您创建指向结构的指针作为结构的成员,如下所示:
struct mystruct {
int val;
struct mystruct *next;
};
Run Code Online (Sandbox Code Playgroud)
在next定义成员时,struct mystruct被认为是不完整的.这很好,但是因为允许指向不完整类型的指针.
一旦遇到结构的右括号,结构就被认为是完整的,你可以定义它的实例.
另一方面,如果你试图这样做:
struct mystruct {
int val;
struct mystruct next;
};
Run Code Online (Sandbox Code Playgroud)
这将是无效的,因为结构不能包含自身.
您还可以创建这样的结构的前向声明:
struct mystruct;
Run Code Online (Sandbox Code Playgroud)
这也会创建一个不完整的类型,并允许您有两个相互引用的结构:
struct mystruct1;
struct mystruct2 {
int val;
struct mystruct1 *other;
};
struct mystruct1 {
int val;
struct mystruct2 *other;
};
Run Code Online (Sandbox Code Playgroud)