C语言的远期申报?

C语言的远期申报?,c,C,我有一个有序列表结构,它有两个成员,一个Titem类型的数组和一个int计数器。现在,此列表可以采用任何类型并按升序排列。假设我决定键入def char Titem,那么数组包含字符,如果我键入def int Titem,那么数组包含整数。现在,我在某处有一个塔吉类型的结构 如何使有序列表识别它。当我打字时,它会抱怨。我应该将其插入到OList头文件的何处?或者有一种方法来做正向声明,就像C++中的C++? #ifndef OLIST_H #define OLIST_H

我有一个有序列表结构,它有两个成员,一个Titem类型的数组和一个int计数器。现在,此列表可以采用任何类型并按升序排列。假设我决定键入def char Titem,那么数组包含字符,如果我键入def int 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    

在创建
Titem
数组时,编译器需要类型的完整定义;提前声明是不够的


因此,在创建typedef之前,您需要完全定义
Tage

您不能在此处使用前向声明,除非您希望使用指向
Titem
的指针,例如:

#define MAX 10
typedef struct  {
   int count;
   Titem *array[MAX]; //Titem is not typedefed yet, so error..
} TOrderedList;
因为编译器需要知道Titem的大小才能创建
TOrderedList
struct


包含“代码> TTEM < /Cord>”,在使用之前,我不指望其他文件中包含文件的顺序。

< P> <强>或者有没有一种方法来做正向声明,就像C++中的C++(强/ < > /P>)所做的那样? 不,您不能在此使用转发声明

提前声明不起作用的理由:

当您使用任何类型的前向声明时,编译器不知道它的组成,也不知道其中的成员,编译器只知道该类型存在。因此,对于编译器来说,它是一个不完整的类型。对于不完整的类型,不能创建它的对象,也不能做任何需要编译器知道类型布局的事情,或者只知道它只是一个类型。由于指向所有对象的指针只需要相同的内存分配,因此在将类型作为指针引用时,可以使用前向声明。
但是,这里编译器需要知道类型
Titem
的布局和大小,因为它需要知道在创建数组时要分配多少内存,因此向前声明类型
Titem
将不起作用

解决方案:


您需要让编译器知道
Titem
的布局,方法是在创建数组的源文件中包含定义类型
Titem
的头文件,

“当我定义typedeftage Titem时,它会抱怨。”您应该解释“抱怨”。你收到警告了吗?错误?什么信息?哪一行?这是Treg头文件,我如何将这个头文件导入到上面的源代码中?typedef结构{short int reg;}Treg;无效初始化时间(Treg*t);请问,如何在源文件中包含滴度类型?你能把它包含在代码的某个地方吗?我不想声明Tage结构。我只想做一些类似typedef Treg Titem的事情,并期望上面的源代码能够识别它,并将它链接到TOrderedList结构中的数组。难道没有其他方法可以在上面的代码中包含Tage而不完全定义它吗?Treg有自己的头和源代码。如何将它们导入到上面的源代码中而不重新定义?