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);#endifperson.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
请按任意键继续. . .
阅读全文
0 0
- C语言结构体声明的妙用,隐藏结构体内部信息
- 结构体内部偏移的妙用
- C语言中结构体内部成员的对齐
- C语言结构体声明
- C语言结构体内存对齐的问题
- C语言结构体内存访问的问题
- C语言结构体内存对齐的问题
- c语言结构体内存分配问题
- C语言中的结构体内存对齐
- C语言结构体内存对齐问题
- C语言结构体内存对齐
- C语言结构体内存空间分配
- C语言之结构体内存对齐
- C语言结构体内存对齐问题
- C语言--结构体内存计算规则
- C语言结构体内嵌函数指针
- C语言结构体内存对齐法则
- c语言结构体内存对齐
- SRE Google 运维解密--管理
- C++学习笔记之作用域为类的常量和作用域内的枚举
- SpringBoot开始微服务架构
- Android 测试类的使用
- dubbo 视频
- C语言结构体声明的妙用,隐藏结构体内部信息
- Java 位运算(移位、位与、或、异或、非)
- 代码风格
- FZU 2203 单纵大法好
- CSDN机器学习笔记八 梯度下降
- leetcode 504. Base 7
- MVC设计模式
- H5的video元素实现的Demo
- C++ 枚举类型作用域的思考