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

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

不能直接用 ->

必须用提供的函数访问

相关推荐
ct9789 分钟前
React 状态管理方案深度对比
开发语言·前端·react
李老师讲编程18 分钟前
中国电子学会图形化2020.12月Scratch三级考级题
算法·scratch·信息学奥赛·图形化编程·scratch素材
数量技术宅27 分钟前
2026量化前沿:从Reddit热帖到Python实战,如何用赫斯特指数(Hurst)狙击虚假突破?
开发语言·python
华如锦35 分钟前
面了很多 Java转AI Agent方向,一些面试题总结
java·开发语言·人工智能·python·ai
huangdong_37 分钟前
电商商品SKU图自动分类技术实现:从DOM解析到智能归档
开发语言
退休倒计时39 分钟前
【每日一题】LeetCode 53. 最大子数组和 TypeScript
数据结构·算法·leetcode·typescript
dog25040 分钟前
网络长尾延时的重尾本质
开发语言·网络·php
旖-旎41 分钟前
FloodFill(图像渲染)(1)
c++·算法·深度优先·力扣
戴西软件1 小时前
戴西 DLM 许可授权管理系统:破解无网络环境下工业软件授权难题,助力制造企业降本增效
网络·人工智能·python·深度学习·程序人生·算法·制造