原视频:https://youtu.be/TsUOhPsZk6k
类似与于 OOP 的封装,隐藏结构体的细节,不让用户能够直接操作结构体里的数据。
就像 C 语言自带的 FILE 一样,直接定义 FILE 结构体会出错。
//main.c
#include <stdio.h>
#include "func.h"
int main() {
//直接定义 foo 会报错:incomplete type
foo myfoo;
return 0;
}
//func.c
//在源文件里写结构体的完整定义
typedef struct myfoo {
int id;
double value1;
char name[5];
} foo;
//下面的函数自行实现
foo *foo_create();
void foo_destroy(foo *f);
void foo_set_value(foo *f, int val);
//func.h
//在头文件里只写上不完整的定义
typedef myfoo foo;
foo *foo_create();
void foo_destroy(foo *f);
void foo_set_value(foo *f, int val);
头文件里只写不完整的定义也能用的原因是:头文件里用到的只是指针,编译器不需要知道具体的细节,所以能用。