C中的前向声明?

时间:2012-02-23 16:53:46

标签: c

我有这个有序的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    

3 个答案:

答案 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