Opaque Pointer / Incomplete Type

核心好处是 完全隐藏结构体内部实现,头文件只需要暴露 接口声明 + 类型名 + 操作方法,源文件才是真正定义接口和操作的文件,从而达到封装+解耦,是c语言模拟面向对象私有成员的核心写法。

  1. 因为头文件隐藏了接口的具体定义,所以外部代码无法直到结构体内部成员,只能使用头文件中的操作方法来操作结构体。
  2. 底层实现可以自由修改,也就是头文件对应的源文件可以自由修改
  3. 减少了头文件的依赖,加快编译速度
  4. 统一接口规范
  5. 代码解耦,独立性强
  6. 头文件中所操作的只能是结构体的指针,不能是结构体本身,因为头文件无法知道结构体具体定义

下面用一个例子来解释,写一个计算两个数的和的接口

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;
}
相关推荐
汉克老师22 分钟前
GESP2024年3月认证C++三级( 第三部分编程题(1、字母求和)
c++·string·gesp三级·gesp3级·大小写判断
沐雪轻挽萤30 分钟前
10. C++17新特性-保证的拷贝消除 (Guaranteed Copy Elision / RVO)
开发语言·c++
leaves falling1 小时前
C/C++ 的内存管理,函数栈帧详讲
java·c语言·c++
wuyoula1 小时前
AI导航智能决策系统源码 附教程
c++·tcp/ip·源码
浅念-2 小时前
从LeetCode入门位运算:常见技巧与实战题目全解析
数据结构·数据库·c++·笔记·算法·leetcode·牛客
CoovallyAIHub2 小时前
无人机拍叶片→AI找缺陷:CEA-DETR改进RT-DETR做风电叶片表面缺陷检测,mAP50达89.4%
算法·架构·github
CoovallyAIHub2 小时前
混合训练反而更差?VLM Agent在训练前协调跨数据集标注,文档布局检测F-score从0.860提升至0.883
算法·架构·github
鸿途优学-UU教育2 小时前
教材质量——法考培训的根基与底气
算法
_深海凉_2 小时前
LeetCode热题100-最大数(179)
算法·leetcode·职场和发展
剑挑星河月3 小时前
763.划分字母区间
数据结构·算法·leetcode