c - 不完整的类型与大小
问题描述
我正在编写一个 C 库,并且有一个看起来(大致)像这样的结构:
struct Obj {
char tag,
union {
int i,
void *v
} val
};
我不想通过 API 暴露这个结构的内部,因为用户不需要知道实现,他们可以在未来的版本中改变。用户可以通过 API 中的函数与结构进行交互。
我在我的 API 中为其他更大的类型使用了标头中的不完整类型,这些类型只能由用户通过指针访问。我不想限制用户Obj
通过指针访问,因为Obj
最多可能只有 16 个字节。
我无法在这里使用不完整的类型,因为我不知道有一种方法可以只向用户公开结构的大小,而没有字段。
我的问题是:有没有办法只在 C 中公开具有大小的类型(不知道给用户的结构中的字段),还有其他一些技巧来完成我想要的,或者我应该以完全不同的方式实现它?
如果我没有提供足够的细节或任何不清楚的地方,请发表评论。
解决方案
标准模式是创建一个为用户分配结构的函数:
struct Obj* obj_new(void) {
return malloc(sizeof(struct Obj));
}
然后在您的公共标头中将类型保留为不完整。
当然,如果你真的只想公开大小,你可以创建一个返回的函数sizeof(struct Obj)
。显然人们可能会滥用它(例如,将值硬编码到他们的代码中作为“优化”以避免调用该函数),但这不取决于你。这是偶尔做的事情,通常是为了帮助促进继承。
推荐阅读
- javascript - 如何根据选择日期显示日历?
- laravel - Laravel 角色中间件角色或角色而不是角色和角色
- reactjs - 未捕获的 TypeError:formData 不可迭代
- mongodb - 如何在不更改参数的情况下在 bash shell 中显示我的 MongoDB 查询 --eval 的所有结果?
- android - 理解 RxJava + Kotlin 中的 CompositeDisposable
- java - Сan 无法从 ADFS 服务器获得 SAML 响应
- php - 如何在控制器 Codeigniter 中调用模态引导程序?
- c# - ASP.NET Core SignalR 使用 Azure AD 返回 401 Unauthorized
- apache-kafka - 按键分组 Ktable 后时间戳无效(负)
- postgresql - 如何在 postgresql 存储函数中从 jsonb 返回表?