我想在多个.c文件中全局提供链接列表。
我已经阅读了如何执行此操作,但我无法确定导致问题的原因。
我在LinkedList.h中声明了带extern的变量:
extern LinkedList* canQueue;
然后在main.c中我通过将变量发送到LinkedList.c中的函数来初始化变量,如下所示:
LinkedList *canQueue=createList();
这是LinkedList.c中的create函数:
LinkedList* createList() /*creates empty linked list*/
{
LinkedList* myList;
myList = malloc(sizeof(LinkedList));
myList->head = NULL;
return myList;
}
然后我想在另一个文件cpu.c中使用canQueue。我在cpu.c中包含了LinkedList.h,所以此时应该从我所知的链接列表中获取。但是当我尝试访问它时,我收到一个错误:
undefined reference to 'canQueue'
我错过了什么或做错了吗?
答案 0 :(得分:2)
似乎你根本就没有定义这样的全局变量。如果此代码编译:
LinkedList *canQueue = createList();
那么它不是“全局”(文件范围)变量。在文件范围定义它并仔细初始化它,这样就不会用局部变量对其进行遮蔽。总而言之,做这样的事情:
// at global scope
LinkedList *canQueue;
void initialize() // or whatever
{
canQueue = createList();
}
答案 1 :(得分:1)
初始化时,您需要为全局变量指定常量。并且函数的return
不被视为常量。因此,以下将显示错误:
LinkedList *canQueue=createList();
编辑我错过了您已在*canQueue
而不是function scope
声明并初始化指针file scope
。这违反了{global variable
的定义{1}}。但是还有一个问题。如果你在文件范围内声明LinkedList *canQueue=createList();
之类的内容,你会收到以下错误:
Initializer element not constant
由于对象将在文件范围“声明”,因此它具有静态存储持续时间。静态存储持续时间对象的初始化程序必须是常量表达式。函数调用的结果不是常量表达式