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

测试环境: 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 #include #include #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;

}

void

person_free(struct person **person)

{

if (!person || !(*person)) return;

free(*person);

*person = NULL;

}

void

getPersonInfo(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);

void

person_free(struct person **person);

void

getPersonInfo(struct person *person);

#endif

person.h这个头文件是一个“公共头文件”,被其他的应用程序include。里面声明了结构体struct person和公共函数。

main.c

// main.c

#include #include #include #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

请按任意键继续. . .

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值