我有这个有序的List结构,其结构有两个成员,一个Titem类型的数组和一个int计数器。现在,此List可以采用任何类型并按升序排列。假设,我决定使用typedef char Titem,然后数组包含字符,如果我是typedef int Titem,那么数组包含整数。现在,我有一个Tage类型的结构;
如何使订购清单识别它。当我做typedef Tage Titem时,它抱怨道。我应该在哪里插入OList头文件?或者有没有办法做前向声明,就像在C ++中用C ++完成一样?
#ifndef OLIST_H
#define OLIST_H
/*typedef char Titem; here, i typedef char to Titem, though commented out..
how do i do similar thing for the Tage datatype i have?
*/
#define MAX 10
typedef struct {
int count;
Titem array[MAX]; //Titem is not typedefed yet, so error..
} TOrderedList;
void initialize_list(TOrderedList *list);
int insert_item(TOrderedList *list, Titem item);
int retrieve_ith(const TOrderedList *list, int i, Titem *item);
int number_of_items(const TOrderedList *list);
int list_empty(const TOrderedList *list);
#endif
答案 0 :(得分:2)
除非您想使用指向Titem
的指针,否则不能在此处使用转发声明,例如:
#define MAX 10
typedef struct {
int count;
Titem *array[MAX]; //Titem is not typedefed yet, so error..
} TOrderedList;
由于编译器需要知道Titem的大小才能创建TOrderedList
结构。
在使用Titem
之前包括{{1}}的定义,我不会指望其他文件中包含文件的顺序。
答案 1 :(得分:1)
或者有没有办法做前向声明,就像在C ++中用C语言完成一样?
不,你不能在这里使用转发声明。
为什么前置声明不起作用的原因:
当您使用任何类型的前向声明时,编译器不知道它的组成也不知道其中的成员,编译器只知道该类型存在。因此,它是编译器的不完整类型。对于不完整类型,无法创建它的对象或执行任何需要编译器知道类型布局的事情,或者不仅仅是类型的事实。由于指向所有对象的指针只需要相同的内存分配,因此只需将类型作为指针进行复制即可使用前向声明。
但是,这里编译器需要知道类型Titem
的布局和大小,因为它需要知道在创建数组时要分配多少内存,因此前向声明类型Titem
将不起作用。 / p>
<强>解决方案:强>
您需要让编译器知道Titem
的布局,并且这样做的方法是在创建数组的源文件中包含定义类型Titem
的头,
答案 2 :(得分:0)
在创建Titem
数组时,编译器需要完整定义类型;前瞻性声明是不够的。
因此,您需要在创建typedef之前完全定义Tage
。