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

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

不能直接用 ->

必须用提供的函数访问

相关推荐
Joy T1 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
专注仿真4 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
码爸5 小时前
支持向量机介绍与示例
算法·机器学习·支持向量机
怕浪猫5 小时前
2028编程圈很火的10个Skills
算法·面试·github
Best-Wishes5 小时前
科来网络分析系统(技术交流版)使用说明书
开发语言·junit·php
代码不停5 小时前
自动化测试(java)
java·开发语言·selenium·自动化
鬼手点金7 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
爱上网的小舟7 小时前
星际战士2启动错误怎么办?5种游戏报错解决方法
开发语言·php
阿里嘎多学长8 小时前
2026-10-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管
wangchunyu1149 小时前
Python 数据可视化实战入门教程
开发语言·python·信息可视化