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