参考自b站up主
main.c
int main() {
Person* p = PersonNew("aaa", 10, NULL);
PersonToString(p);
PersonDestroy(&p);
void* p1 = PersonNew("bbb", 10, NULL);
PersonToString((Person*)p1);
PersonDestroy((Person**)&p1);
//fopen();
return 0;
}
Person.h
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct
{
void* _Placeholder;
} Person;
Person* PersonNew(char const* name, int age, char const* intro);
char const* PersonGetName(Person const* p);
int PersonGetAge(Person const* p);
void PersonToString(Person const* p);
void PersonDestroy(Person** ptr);
Person.c
#include"Person.h"
typedef struct
{
union
{
Person public_person;
char const* name;
};
int age;
char intro[];
}PersonInternal;
;
Person* PersonNew(char const* name, int age, char const* intro) {
size_t intro_len = (intro ? strlen(intro) : 0) + 1;
PersonInternal* p = (PersonInternal*)malloc(sizeof(PersonInternal) + intro_len);
p->age = age;
p->name = name;
if (intro)
{
strcpy(p->intro, intro);
}
else
{
p->intro[0] = 0;
}
return &p->public_person;
}
char const* PersonGetName(Person const* p){
return ((PersonInternal*)p)->name;
}
int PersonGetAge(Person const* p) {
return ((PersonInternal*)p)->age;
}
void PersonToString(Person const* p) {
PersonInternal* person_internal = (PersonInternal*)p;
printf("Person{name=%s,age=%d,intro=%s}\n",person_internal->name, person_internal->age, person_internal->intro);
}
void PersonDestroy(Person** ptr) {
if (ptr && *ptr)
{
free(*ptr);
*ptr = NULL;
}
}