如何在不使用Malloc的情况下使typedef尽可能私有?

jon*_*ovy 3 c plc

我正在寻找一种方法来创建私有样式typedef,只能从一组特定的函数调用(setBit(bit_typ*const t),getBit(bit_typ*const t))访问或操作.我正在寻找一种方法来做到这一点,而不使用malloc,有没有人有任何想法?

编辑://这个问题不同于这一个,因为它正在寻求获得尽可能接近"私人"的结构,而其他问题(TL; DR是有办法来定义其仍然可以被分配在一个不透明的类型堆栈,并且没有违反严格的别名规则?)寻找解决与我的问题的一个可能的解决方案相关的问题.

AnT*_*AnT 5

一种方法是公开opaque类型的总大小,并使用use将opaque类型的对象声明为unsigned char [N]缓冲区.例如,假设您有一些类型OpaqueType,您要向用户隐藏其内部.

在头文件(向用户公开)中,您执行此操作

typedef unsigned char OpaqueType[16];
Run Code Online (Sandbox Code Playgroud)

16您要隐藏的类型的确切字节大小在哪里.在头文件中,您可以根据该类型编写整个界面,例如

void set_data(OpaqueType *dst, int data);
Run Code Online (Sandbox Code Playgroud)

在实现文件中,您声明实际类型

typedef struct OpaqueTypeImpl
{
  int data1;
  double data2;
} OpaqueTypeImpl;
Run Code Online (Sandbox Code Playgroud)

并实现如下功能

void set_data(OpaqueType *dst, int data)
{
  OpaqueTypeImpl *actual_dst = (OpaqueTypeImpl *) dst;
  actual_dst->data1 = data;
}
Run Code Online (Sandbox Code Playgroud)

您还可以添加一个静态断言,以确保它与之sizeof(OpaqueType)相同sizeof(OpaqueTypeImpl).

当然,正如下面的评论中已经指出的那样,必须采取额外的步骤来确保这些对象的正确对齐,例如_AlignasC11或"经典"C中的一些基于联合的技术.

这样你就可以让用户有机会声明非动态对象OpaqueType,即你不强迫用户在malloc内部调用你的函数.同时,您不会向用户展示有关您的类型的内部结构的任何信息(除了它的总大小和对齐要求).

另请注意,OpaqueType以这种方式声明的是一个数组,这意味着它不可复制(除非您使用memcpy).如果您想积极阻止无限制的用户级复制,这可能是一件好事.但是如果要启用复制,可以将数组包装到结构中.

这种方法并不是非常优雅,但这可能是隐藏实现的唯一方法,当您希望保持类型的对象可由用户自定义时.