我有一个dish.h文件,我写了这个typedef:
typedef struct dish_t* Dish;
然后我有一个dish.c文件,我在其中定义了我的结构:
struct dish_t {
Type type;
char *name;
int sweetness;
int saltiness;
int sourness;
};
我在dish.c中写了一些unitests。他们没事,但是一旦我把它们移到了一个sepearate dish_test.c文件中,我就收到了以下错误:
"指向不完整类型的指针"
一旦我尝试访问像这样的Dish实例,它就得到了支持:
dish=dishCreate("soup",1,2,3,type,&error);
int cmp=strcmp("soup",dish->name); // error accured here
为什么它会开心呢?
答案 0 :(得分:1)
在多个文件中使用时,应将结构定义移动到头文件中。
如果你想让它保持“私密”,你需要两个头文件,一个是公共文件,一个是私有文件。
答案 1 :(得分:0)
之所以发生这种情况,是因为您将定义移出了测试代码无法看到的位置。
#include
完全相同,它包含您提供的文件。在移动定义之前,编译器构建结构的方式是可见的,现在它无法知道" name"盘结构的元素是。
将类型的定义移回标题中,或者使用Dish
的访问器函数,而不是直接写入元素,如果您希望更像OO样式。