C 编程记录

用于个人学习,资料来源于互联网和书籍,用于记录自己工作和学习中遇到的问题

一、常用技巧

隐藏结构体成员:

见如下代码:

#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的首地址了。

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值