类型不完整且大小不正确的

时间:2018-10-20 03:26:08

标签: c incomplete-type

我正在编写一个C库,并具有一个(大致)如下所示的结构:

struct Obj {
    char tag,
    union { 
        int i,
        void *v
    } val
};

我不想通过API公开此结构的内部信息,因为用户不需要了解实现,并且可以在将来的版本中进行更改。用户可以通过API中的函数与该结构进行交互。

我在API中的其他较大的类型的标头中使用了不完整的类型,这些类型只能由用户通过指针进行访问。我不想限制用户通过指针访问Obj,因为Obj可能最多只有16个字节。

我无法在此处使用不完整的类型,因为我不知道一种仅向用户公开结构大小而没有字段的方法。

我的问题是: 有没有办法只用C公开一个具有大小的类型(不知道给用户的结构体中的字段),或者其他一些技巧来完成我想要的,还是应该以完全不同的方式实现呢?

如果我没有提供足够的详细信息或不清楚的地方,请发表评论。

1 个答案:

答案 0 :(得分:1)

为此的标准模式是创建一个为用户分配结构的函数:

struct Obj* obj_new(void) {
  return malloc(sizeof(struct Obj));
}

然后在公共标题中将类型保留为不完整。

当然,如果您只想公开尺寸,则可以创建一个返回sizeof(struct Obj)的函数。显然,人们会滥用它(例如,将值硬编码到他们的代码中作为“优化”,以避免调用该函数),但这不是您的责任。这是偶尔执行的操作,通常是为了帮助促进继承。