c - 不完整的类型与大小

标签 c incomplete-type

我正在编写一个 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/

相关文章:

c - 如何在 Netbeans 中获取 C 文档?

c - 最终程序从 C 函数返回

c++ - 删除不完整类型的对象

c++ - 不完整类型的无效使用(嵌套类案例)

c - 具有内部链接的变量的暂定定义具有不完整的非数组类型 : conforming implementations show different behavior

c - 免费通话时进行核心转储

ios - Mach 代码导致 iOS 和 Cocoa 上的内存耗尽

C - 为什么 fopen 不起作用?

c++ - 错误: aggregate has incomplete type and cannot be defined

C++ 这是一个不完整的类型吗?