我正在编写一个 C 库,并且有一个看起来(大致)像这样的结构:
struct Obj {
char tag,
union {
int i,
void *v
} val
};
我不想通过 API 公开这个结构的内部结构,因为用户不需要知道实现,他们可能会在未来的版本中发生变化。用户可以通过 API 中的函数与结构进行交互。
我在 API 的其他较大类型的 header 中使用了不完整的类型,用户只能通过指针访问这些类型。我不想限制用户通过指针访问 Obj
,因为 Obj
可能最多只有 16 个字节。
我在这里无法使用不完整的类型,因为我不知道有什么方法可以只向用户公开结构的大小,而没有字段。
我的问题是: 有没有一种方法可以仅在 C 中公开具有大小的类型(不知道提供给用户的结构中的字段),一些其他的 hack 来完成我想要的,或者我应该以完全不同的方式实现它?
如果我没有提供足够的细节或有任何不清楚的地方,请发表评论。
最佳答案
标准模式是创建一个为用户分配结构的函数:
struct Obj* obj_new(void) {
return malloc(sizeof(struct Obj));
}
然后在您的公共(public) header 中将该类型保留为不完整。
当然,如果您真的只想公开大小,您可以只创建一个返回 sizeof(struct Obj)
的函数。显然人们可能会滥用它(例如,将值硬编码到他们的代码中作为“优化”以避免调用该函数),但这不是你的责任。这是偶尔做的事情,通常是为了帮助促进继承。
关于c - 不完整的类型与大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52902135/