当前位置:   article > 正文

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

王凯c语言

测试环境: vs2008

1. 前言

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

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

2.一个实现的小例子

person_private.h 

  1. // person_private.h
  2. #ifndef __PERSON_PRIVATE__
  3. #define __PERSON_PRIVATE__
  4. struct person {
  5. char name[128];
  6. int age;
  7. char job[128];
  8. };
  9. #endif

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

person.c

  1. // person.c
  2. #include <stdio.h>
  3. #include <malloc.h>
  4. #include <string.h>
  5. #include "person_private.h"
  6. struct person*
  7. person_new(const char *name, int age, const char *job)
  8. {
  9. if (!name || !job) return NULL;
  10. struct person *_this = (struct person *)calloc(1, sizeof(struct person));
  11. if (!_this) return NULL;
  12. memcpy(_this->name, name, strlen(name));
  13. _this->age = age;
  14. memcpy(_this->job, job, strlen(job));
  15. return _this;
  16. }
  17. void
  18. person_free(struct person **person)
  19. {
  20. if (!person || !(*person)) return;
  21. free(*person);
  22. *person = NULL;
  23. }
  24. void
  25. getPersonInfo(struct person *person)
  26. {
  27. if (!person) {
  28. printf("Error: param null pointer\n");
  29. return;
  30. }
  31. printf("name: %s, age = %d, job = %s\n", person->name, person->age, person->job);
  32. }
person.c实现了对这个结构struct person分配内存,释放内存,和获取对象信息的函数。其中person_private.h只被person.c包含。

person.h

  1. // person.h
  2. #ifndef __PERSON_H__
  3. #define __PERSON_H__
  4. struct person;
  5. struct person*
  6. person_new(const char *name, int age, const char *job);
  7. void
  8. person_free(struct person **person);
  9. void
  10. getPersonInfo(struct person *person);
  11. #endif
person.h这个头文件是一个“公共头文件”,被其他的应用程序include。里面声明了结构体struct person和公共函数。

main.c

  1. // main.c
  2. #include <stdio.h>
  3. #include <malloc.h>
  4. #include <string.h>
  5. #include "person.h"
  6. int main()
  7. {
  8. struct person *per = person_new("zhangsan", 20, "student");
  9. if (!per) return -1;
  10. getPersonInfo(per);
  11. person_free(&per);
  12. printf("After free, per = %p\n", per);
  13. return 0;
  14. }
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
请按任意键继续. . .


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/714902
推荐阅读
相关标签
  

闽ICP备14008679号