我的库里有几个struct:edge,vertex,graph。 我想隐藏用户的结构体(用户必须使用API),所以在头文件(例如edge.h)中我只是把:
typedef struct edge edge_t;
edge struct的定义在edge.c中。
struct edge {...};
这很好,但我想不想隐藏我自己的代码中的struct的主体。我想在edge.c中使用:
vertex_t v;
v.some_attribute = x;
现在我得去解除指向不完整类型错误的指针,是否可以修复它? 是否有任何其他选项对所有struct元素使用访问器(如用户)?
答案 0 :(得分:5)
如果您需要使用其他源文件中的结构,则需要完整的结构定义。所以解决方案是将struct edge { /* ... */ }
放在头文件中,并在需要时包含标题。
答案 1 :(得分:2)
Joachim Pileborg是对的。
编译器需要知道结构的大小才能使用它。防止这种情况的唯一方法是强制用户使用指针。
typedef struct edge *edge_t;
编译器知道指针的大小,因此它知道需要为它分配多少空间。