C 语言 typedef 结构体私有化

完整可运行案例(纯 C 语言,不依赖任何库)

第一步:头文件 person.h 对外公开(别人能看到)

复制代码
#ifndef PERSON_H
#define PERSON_H

// 🔥 关键:只声明,不定义!不完整类型!
typedef struct _person_t person_t;

// 只能通过函数创建、访问、销毁
person_t* person_create(const char* name, int age);
void      person_delete(person_t* p);

// 对外提供访问接口(getter)
const char* person_get_name(person_t* p);
int         person_get_age(person_t* p);

#endif

第二步:源文件 person.c 内部实现(别人看不到)

复制代码
#include <stdlib.h>
#include <string.h>
#include "person.h"

// 🔥 真正的结构体定义 ------ 对外完全隐藏!私有化!
struct _person_t {
    char name[20];
    int  age;
};

// 创建对象
person_t* person_create(const char* name, int age)
{
    person_t* p = malloc(sizeof(person_t));
    strncpy(p->name, name, sizeof(p->name)-1);
    p->age = age;
    return p;
}

// 销毁
void person_delete(person_t* p)
{
    if(p) free(p);
}

// 获取名字
const char* person_get_name(person_t* p)
{
    return p->name;
}

// 获取年龄
int person_get_age(person_t* p)
{
    return p->age;
}

第三步:主文件 main.c 你写业务的地方

复制代码
#include <stdio.h>
#include "person.h"

int main()
{
    // 1. 创建对象
    person_t* p = person_create("小明", 20);

    // 2. 只能用函数访问!
    printf("名字:%s\n", person_get_name(p));
    printf("年龄:%d\n", person_get_age(p));

    // 3. 🔥 你绝对不能写下面这句!编译失败!
    // printf("%s", p->name);  // 错误:不完整类型!

    person_delete(p);
    return 0;
}

一运行你就看到结果:

复制代码
名字:小明
年龄:20

如果你强行写:

复制代码
p->age;
p->name;

编译器直接报错:

复制代码
错误:不允许使用指向不完整类型 "struct _person_t" 的指针

我用一句话告诉你原理:

person.h 只告诉你:

有个 person_t 但不告诉你里面有什么

person.c 才真正定义:

复制代码
struct _person_t {
    char name[20];
    int age;
};

外部看不到 → 不能直接 ->

只能用我给你的函数访问 → 安全、封装、私有


最终总结(你彻底懂了)

C 语言结构体私有化 = 不透明类型 = 隐藏实现

外部只能看到结构体名字,看不到成员

不能直接用 ->

必须用提供的函数访问

相关推荐
彦为君1 小时前
JavaSE-11-BIO/NIO/AIO(多人聊天室)
java·开发语言·python·ai·nio
yzx9910131 小时前
递归算法入门:像俄罗斯套娃一样思考
人工智能·算法
计算机安禾1 小时前
【c++面向对象编程】第43篇:可变参数模板(C++11):优雅处理不定长参数
java·开发语言·c++
心中有国也有家1 小时前
从零上手 CANN 学习中心:像逛技术便利店一样学昇腾
学习·算法·开源
Hanniel1 小时前
Python __slots__ 入门指南
开发语言·python·性能优化
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第69题】【JVM篇】第29题:GC Roots 有哪些?
java·开发语言·jvm·面试
oo哦哦1 小时前
搜索矩阵系统的最短路密码:用Dijkstra算法和网络流理论,解释为什么你做了1000个关键词,流量还不如别人30个
网络·算法·矩阵
Matlab程序猿小助手1 小时前
【MATLAB源码-第319期】基于matlab的帝王蝶优化算法(MBO)无人机三维路径规划,输出做短路径图和适应度曲线.
开发语言·算法·matlab
码点滴1 小时前
CRI-O选型与容器运行时标准
开发语言·人工智能·架构·kubernetes·cri-o