核心好处是 完全隐藏结构体内部实现,头文件只需要暴露 接口声明 + 类型名 + 操作方法,源文件才是真正定义接口和操作的文件,从而达到封装+解耦,是c语言模拟面向对象私有成员的核心写法。
- 因为头文件隐藏了接口的具体定义,所以外部代码无法直到结构体内部成员,只能使用头文件中的操作方法来操作结构体。
- 底层实现可以自由修改,也就是头文件对应的源文件可以自由修改
- 减少了头文件的依赖,加快编译速度
- 统一接口规范
- 代码解耦,独立性强
- 头文件中所操作的只能是结构体的指针,不能是结构体本身,因为头文件无法知道结构体具体定义
下面用一个例子来解释,写一个计算两个数的和的接口
sum.h
#pragma once
typedef struct sum_t sum_t;
sum_t* sum_create(int a, int b);
int sum_get_result(sum_t* s);
void sum_destroy(sum_t* s);
sum.c
#include "sum.h"
#include <stdlib.h>
struct sum_t {
int a;
int b;
};
sum_t* sum_create(int a, int b) {
sum_t* s = (sum_t*)malloc(sizeof(sum_t));
if (s) {
s->a = a;
s->b = b;
}
return s;
}
int sum_get_result(sum_t* s) {
if (s) {
return s->a + s->b;
}
return 0; // or handle error as appropriate
}
void sum_destroy(sum_t* s) {
free(s);
}
main.c
#include <stdio.h>
#include "sum.h"
int main(void) {
sum_t* s = sum_create(3, 4);
if (s) {
int result = sum_get_result(s);
printf("The sum is: %d\n", result);
sum_destroy(s);
} else {
printf("Failed to create sum_t instance.\n");
}
return 0;
}