C语言结构体声明的妙用,隐藏结构体内部信息

来源:互联网 发布:网络上icbc是什么意思 编辑:程序博客网 时间:2024/06/04 19:40

测试环境: vs2008

1. 前言

C语言是一个比较底层的语言,似乎没有c++,java高级语言中对成员变量的保护,例如加上private修饰。但其实C语言也可以通过结构体的声明达到类型的效果。

具体的做法是在一个头文件里定义一个结构,另外一个C文件实现,操作这个结构的函数。其中,定义结构的头文件只能被实现其操作的C文件include。当第三方的程序想操作这个结构的时候,只能include一个“公共的头文件”,这个公共的头文件里面包含那个结构体的声明,和对其操作的函数的声明。

2.一个实现的小例子

person_private.h 

// person_private.h#ifndef __PERSON_PRIVATE__#define __PERSON_PRIVATE__struct person {    char name[128];    int  age;    char job[128];};#endif

上述代码定义了一个私有的头文件,里面定义了结构person。

person.c

// person.c#include <stdio.h>#include <malloc.h>#include <string.h>#include "person_private.h"struct person*person_new(const char *name, int age, const char *job){    if (!name || !job) return NULL;    struct person *_this = (struct person *)calloc(1, sizeof(struct person));    if (!_this) return NULL;    memcpy(_this->name, name, strlen(name));    _this->age = age;    memcpy(_this->job, job, strlen(job));    return _this;}voidperson_free(struct person **person){    if (!person || !(*person)) return;    free(*person);    *person = NULL;}voidgetPersonInfo(struct person *person){    if (!person) {        printf("Error: param null pointer\n");        return;    }    printf("name: %s, age = %d, job = %s\n", person->name, person->age, person->job);}
person.c实现了对这个结构struct person分配内存,释放内存,和获取对象信息的函数。其中person_private.h只被person.c包含。

person.h

// person.h#ifndef __PERSON_H__#define __PERSON_H__struct person;struct person*person_new(const char *name, int age, const char *job);voidperson_free(struct person **person);voidgetPersonInfo(struct person *person);#endif
person.h这个头文件是一个“公共头文件”,被其他的应用程序include。里面声明了结构体struct person和公共函数。

main.c

// main.c#include <stdio.h>#include <malloc.h>#include <string.h>#include "person.h"int main(){    struct person *per = person_new("zhangsan", 20, "student");    if (!per) return -1;    getPersonInfo(per);    person_free(&per);    printf("After free, per = %p\n", per);    return 0;}
main.c实现了对结构struct person的应用。注意的是,在main.c中不能够直接定义一个struct person对象,只能定义struct person指针,是因为编译器不知道struct person真实占用的内存大小。仔细看main.c包含的是person.h,person.h里面只有结构体的声明。

3. 编译运行

name: zhangsan, age = 20, job = student
After free, per = 00000000
请按任意键继续. . .


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 ie文件找不到了怎么办 ie文件不存在了怎么办 大学素质分不够怎么办 素拓学分不够怎么办 大学毕业之前素拓分拿不满怎么办 武汉幼儿医保卡怎么办 养老院护工欺老人怎么办 皮肤毛孔粗大有痘印痘坑怎么办 额头上毛孔大怎么办 额头皮肤毛孔大怎么办 脸部粗糙毛孔大怎么办 脸上有痘印毛孔粗大怎么办 毛孔粗大痘印怎么办 教官12123一直加载怎么办 教官嗓子哑了怎么办 喜欢上考场教官怎么办 跟教官打起来怎么办 车险贴丢了怎么办 大学不想军训该怎么办 职高军训不想去怎么办 上大学不想军训怎么办 收费站忘记带钱怎么办 孕妇咳得厉害怎么办 怀孕九个月咳嗽怎么办 门冬氨酸高怎么办 代理保证金不退怎么办 电脑游戏太大下载慢怎么办 四川百裕制药怎么办 想退出学校中层怎么办 眼镜度数高了怎么办 眼睛散光200度怎么办 火车漏乘旅客怎么办 钓鱼逆风走漂怎么办 藏红花喝了上火怎么办 领导经常关注你怎么办 点读机屏幕坏了怎么办 步步高点读机坏了怎么办 健身房体测缺水怎么办 标书有效期过了怎么办 电脑被限制连接怎么办 win7无线网络受限制怎么办