用于个人学习,资料来源于互联网和书籍,用于记录自己工作和学习中遇到的问题
一、常用技巧
隐藏结构体成员:
见如下代码:
#include <stdio.h>
#include "Foo.h"
Person* PersonNew(char const* name, int age, char const* intro);
char const* PersonGetName(Person const* p);
int PersonGetAge(Person const* p);
int main() {
Person* p = PersonNew("li", 29, "bla bla");
printf("%s, %d\n", PersonGetName(p), PersonGetAge(p));
return 0;
}
这里通过接口调用,构建结构体Person并获取Person中的成员信息。
但是想对结构体Person进行屏蔽,不让使用者知道Person中有什么成员。
那么可以建立一个Person.h文件,内容如下:
typedef struct Person {
} Person;
在另外一个头文件Foo.h当中加入如下内容:
#include <stdlib.h>
#include <string.h>
#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);
}
return &p->public_person;
}
char const *PersonGetName(Person const *p) {
return ((PersonInternal*)p)->name;
}
int PersonGetAge(Person const *p) {
return ((PersonInternal*)p)->age;
}
注意这个结构体 PersonInternal
,里面使用了一个union,主要就是用来作为结构体的存储地址索引,这样就可以将Person作为访问PersonInternal
的首地址了。