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 语言结构体私有化 不透明类型 隐藏实现外部只能看到结构体名字看不到成员不能直接用-必须用提供的函数访问