我正在寻找一种方法来创建私有样式typedef,只能从一组特定的函数调用(setBit(bit_typ*const t),getBit(bit_typ*const t))访问或操作.我正在寻找一种方法来做到这一点,而不使用malloc,有没有人有任何想法?
编辑://这个问题不同于这一个,因为它正在寻求获得尽可能接近"私人"的结构,而其他问题(TL; DR是有办法来定义其仍然可以被分配在一个不透明的类型堆栈,并且没有违反严格的别名规则?)寻找解决与我的问题的一个可能的解决方案相关的问题.
一种方法是公开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).如果您想积极阻止无限制的用户级复制,这可能是一件好事.但是如果要启用复制,可以将数组包装到结构中.
这种方法并不是非常优雅,但这可能是隐藏实现的唯一方法,当您希望保持类型的对象可由用户自定义时.
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |