C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在不暴露其类型的情况下公开C结构大小?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在C中有以下内容(不是C!):

@H_279_7@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结构模块模块;
>在module.c中,放置此结构的结构定义.它只对module.c可见,而不对调用者可见.这称为不透明类型.
>调用者只能分配指向此结构的指针,永远不会分配对象.
>来电者代码可能如下所示:

#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

大佬总结

以上是大佬教程为你收集整理的如何在不暴露其类型的情况下公开C结构大小?全部内容,希望文章能够帮你解决如何在不暴露其类型的情况下公开C结构大小?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。