赞
踩
C语言是一个比较底层的语言,似乎没有c++,java高级语言中对成员变量的保护,例如加上private修饰。但其实C语言也可以通过结构体的声明达到类型的效果。
具体的做法是在一个头文件里定义一个结构,另外一个C文件实现,操作这个结构的函数。其中,定义结构的头文件只能被实现其操作的C文件include。当第三方的程序想操作这个结构的时候,只能include一个“公共的头文件”,这个公共的头文件里面包含那个结构体的声明,和对其操作的函数的声明。
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;
- }
-
- 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这个头文件是一个“公共头文件”,被其他的应用程序include。里面声明了结构体struct person和公共函数。
// 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
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里面只有结构体的声明。
name: zhangsan, age = 20, job = student
After free, per = 00000000
请按任意键继续. . .
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。