C中的前向声明?
我有这个有序的列表结构,有一个结构有两个成员,一个Titem类型和一个int计数器的数组。现在,此列表可以采取任何类型并按升序排列。假设,我决定typedef char Titem,然后数组包含字符,如果我typedef int Titem,那么数组包含整数。现在,我有一个类型为Tage的结构;C中的前向声明?
如何使有序列表中识别它。当我确实键入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
还是有办法像它是用C++做在C++做向前声明?
不,你不能在这里使用向前声明。
理由为什么正向声明将无法工作:
当您使用任何类型的前锋声明中,编译器不知道它的组成也不里面的成员,编译器只知道的类型存在。因此,对于编译器来说,这是一个未完成类型。对于不完整的类型,不能创建它的对象或做任何需要编译器知道类型布局的东西,而不是仅仅是一个类型。由于指向所有对象的指针只需要相同的内存分配,因此只要将类型作为指针重新使用时就可以使用前向声明。
然而,这里的编译器需要知道的类型Titem
的布局和大小,因为它需要知道多少内存,同时创建一个数组,因此向前声明类型Titem
将无法正常工作分配。
解决方案:
你需要让的Titem
布局要做到这一点的方式,编译器知道是为包括标题,你创建数组在源文件中定义的类型Titem
,
请问,我如何在源文件中包含Titem类型?你能把它包含在代码中吗?我不想声明Tage结构。我只想做一些类似于typedef Treg Titem的事情,并期望上面的源代码来识别它并将它链接到在TorderedList结构中的数组。 – helpdesk 2012-02-23 21:24:29
作为要创建的Titem
阵列,编译器需要的类型的完整定义;前向宣言是不够的。
所以,你需要创建您的typedef之前完全定义Tage
。由于编译器需要知道Titem的大小,以创建TOrderedList
结构
#define MAX 10
typedef struct {
int count;
Titem *array[MAX]; //Titem is not typedefed yet, so error..
} TOrderedList;
:
,难道没有其他办法可以在上面的代码中包含Tage,而不是完全定义它? Treg拥有自己的头文件和源代码。我如何将它们导入到上面的源代码中而不用重新定义它? – helpdesk 2012-02-23 21:25:55
你不能在这里使用前置声明,除非你想用指针来Titem
,等等。
包括Titem
定义你使用它之前,我不会在其他文件中包含文件的顺序计数。
“当我确实输入了Tage Titem时,它抱怨道。”你应该解释“抱怨”。你有警告吗?错误?信息是什么?什么线? – abelenky 2012-02-23 16:57:44
这里是Treg头文件,我如何将这个头文件导入上面的源代码? typedef struct { short int reg; } Treg; void initializeTime(Treg * t); – helpdesk 2012-02-23 21:30:32