我查了一下,没有找到任何可以帮助我的资料,所以我不得不问。这是代码:
list.h:
typedef struct List_t *List;
list.c:
#include "list.h"
#include <stdlib.h>
#include <stdio.h>
typedef struct Item_t
{
struct Item_t* next;
ListElement data;
}*Item;
typedef struct List_t
{
Item head;
Item iterator;
CopyListElement copyFunc;
FreeListElement freeFunc;
};
list_example_test.c:
#include "list.h"
#include <stdlib.h>
#include <stdio.h>
ListElement copyA(ListElement a)
{
return a;
}
void destroyA(ListElement a)
{
}
bool testListCreate();
bool testListCopy()
{
List list1=listCreate(copyA,destroyA);
listInsertFirst(list1,(void*)6);
listInsertFirst(list1,(void*)2);
listInsertFirst(list1,(void*)1);
List list2=listCopy(list1);
listClear(list1);
if(list2->head==NULL) //here is the error!!
{
return false;
}
return true;
}
最后一段代码应该检查listCopy()函数是否工作。编译器识别List这个名字,当我输入"list2->"时,它甚至建议用List的字段自动完成(在这个例子中,我选择了"list2->head")。问题的原因是什么?如何解决?谢谢!
将struct List_t的定义移到。h文件中
list_example_test.c没有struct List_t的定义,它只知道它是一个struct(来自.h文件),所以编译器没有办法计算到List_t的"头"成员的偏移量。
就list_example_test.c
而言,List_t
是一个不完全类型。这实际上是C语言中封装数据的常用习惯用法。应该在某个地方定义函数,允许您在不直接访问列表内部的情况下操作List_t类型的项。你可能会发现你在某处定义了listNext(List_t)
或listIterate(List_t)
。查看与声明listCopy()
相同的文件。