完整可运行案例(纯 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; };