我必须创建一个程序,用链表执行各种功能。我必须将函数保存在main()的一个单独文件中,但我不知道如何将列表包含在头文件中。我尝试了不同的组合,现在我在linkedList.h文件中有这个:
typedef struct list_elements* item;
这个在linkedList.c 中
typedef struct list_elements{
int value;
struct list_elements *next;
}item
问题是,当我试图编译main.c时,我得到的消息是:"请求在非结构或并集中的成员'value'"one_answers"请求非结构或联集中的成员'next'"。
我查看了建议的教科书和网上,但我找不到关于如何使用带头文件的链表的解释?
(当我在一个文件中测试整个功能时,这些功能就可以工作,所以我不认为它们是问题所在);
您正试图将同一标识符类型定义为不同类型两次。
删除第一个typedef typedef struct list_elements* item;
,并将第二个放在标头linkedList.h中,该标头必须包含在linkedList.c中。
头中的声明将类型item
定义为指向struct list_elements
的指针。来自linkedList.c
的声明声明了与类型struct list_elements
本身的别名相同的名称item
。尽管这不是固有的错误,但肯定会令人困惑。它确实使linkedList.c
到#include
成为头文件是错误的,通常情况下这样做是合适的
您应该在头文件中进行所有类型声明,并将其包含在两个C源文件中,以确保它们共享这些声明。类型声明至少包括typedef
s、struct
和union
声明以及函数原型。这不是一个你可能想放在标题中的内容的排他性列表。
实现这一点的方法不止一种:
其中之一是用你想在.h文件中使用的函数原型和单独的.c中的函数代码来定义结构(当然,在.h文件里写的原型是一样的),然后你就可以在任何其他.c文件中使用这个结构了,包括你的头文件。例如:
StType.h
typedef struct Something{
int a;
int b;
}
typedef struct anotherSomething{
int c;
int d;
}
int fct1();
int fct2();
Fct.c
include StType.h;
int fct1()
{
//...
}
void fct2()
{
//...
}
您的程序.c
include StType.h
int main()
{
Something s;
fct1();
}
我经常做这样的事。