如何在不暴露其类型的情况下公开C结构大小?
发布时间:2020-12-16 09:22:56 所属栏目:百科 来源:网络整理
导读:我在C中有以下内容(不是C!): module.c struct Private {...}; void foo(void* private,int param) {...}module.h #define PRIVATE_SIZE ???; void foo(void* private,int param);main.c char m1[PRIVATE_SIZE]; char m2[PRIVATE_SIZE]; int main() { foo(m
我在C中有以下内容(不是C!):
module.c struct Private {...}; void foo(void* private,int param) {...} module.h #define PRIVATE_SIZE ???; void foo(void* private,int param); main.c char m1[PRIVATE_SIZE]; char m2[PRIVATE_SIZE]; int main() { foo(m1,10); foo(m2,20); } 如何在编译时公开sizeof(Private),以便应用程序可以静态分配其存储而不暴露私有类型? 注意,这是一个非常有限的嵌入式系统,并且动态分配不可用. 解决方法
您不应该将结构的大小暴露给调用者,因为这首先打破了私有封装的全部目的.您的私人数据的分配不是调用者的业务.另外,避免使用void *因为它们完全缺乏类型安全性.
这是你在C中编写私有封装的方式: >在module.h中,forward声明一个不完整类型的typedef结构模块模块; #include "module.h" ... module* m; result = module_init(&m) >并且module_init函数充当“构造函数”,在module.h中声明并在module.c中定义: bool module_init (module** obj) { module* m = malloc(sizeof *m); ... m->something = ...; // init private variables if applicable *obj = m; return true; } >如果调用者确实需要知道对象的大小,那么它只是为了硬拷贝等目的.如果需要,请提供一个封装分配和复制的复制函数(“复制构造函数”),例如: result module_copy (module** dst,const module* src); 编辑: 请注意,分配方式是一个单独的问题.您不必为上述设计使用动态分配.例如,在嵌入式系统中,通常使用静态内存池.见Static allocation of opaque data types (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |