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 语言结构体私有化 = 不透明类型 = 隐藏实现

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

不能直接用 ->

必须用提供的函数访问

相关推荐
txzrxz6 分钟前
数论:排列数、组合数、费马小定理、逆元、同余定理
c++·算法·数论·组合数·费马小定理·逆元·排列数
xqqxqxxq8 分钟前
LeetCode Hot100 双指针专项题解笔记
笔记·算法·leetcode
520拼好饭被践踏9 分钟前
JAVA+Agent学习day22
java·开发语言·后端·学习
笨蛋不要掉眼泪21 分钟前
Java虚拟机:堆的参数配置
java·开发语言·jvm
冰暮流星26 分钟前
javascript之date对象
开发语言·javascript·ecmascript
闪电悠米32 分钟前
力扣hot100-54.螺旋矩阵-模拟边界控制详解
算法·leetcode·矩阵
小肝一下35 分钟前
7. 库制作与原理
linux·c语言·操作系统·bash·shell·动静态库
变量未定义~41 分钟前
虚拟节点-星石传送阵(4星)、强连通分量
数据结构·算法
春生野草1 小时前
C基础--八大排序(个人笔记)
c语言·笔记·排序算法
Wang's Blog1 小时前
Go-Zero项目开发17: IM私聊功能实现与消息存储设计
开发语言·后端·golang