何时创建了结构(用户定义的数据类型)?

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实现这些功能


dbu*_*ush 5

该名称一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)