1

我想让一个链接列表在多个 .c 文件中全局可用。

我已经阅读了如何做到这一点,但我无法确定是什么导致了我的问题。

我在 LinkedList.h 中用 extern 声明变量:

extern LinkedList* canQueue;

然后在 main.c 中,我通过将变量发送到 LinkedList.c 中的函数来初始化变量,如下所示:

LinkedList *canQueue=createList();

这是 LinkedList.c 中的创建函数:

LinkedList* createList() /*creates empty linked list*/
  {
    LinkedList* myList;
    myList = malloc(sizeof(LinkedList));
    myList->head = NULL;
    return myList;
  }

然后我想在另一个文件 cpu.c 中使用 canQueue。我已经在 cpu.c 中包含了 LinkedList.h,所以在这一点上,据我所知,Linked List 应该在此处可用。但是当我尝试访问它时,我得到一个错误:

undefined reference to 'canQueue'

我是否错过了什么或做错了什么?

4

2 回答 2

2

看来您根本没有定义这样的全局变量。如果此代码编译:

LinkedList *canQueue = createList();

那么它不是“全局”(文件范围)变量。在文件范围内定义它并仔细初始化它,这样你就不会用局部变量来隐藏它。总而言之,做这样的事情:

// at global scope
LinkedList *canQueue;

void initialize() // or whatever
{
    canQueue = createList();
}
于 2013-05-03T07:34:23.477 回答
1

初始化时需要为全局变量分配一个常量return。并且函数不被视为常量。因此以下将显示错误:

 LinkedList *canQueue=createList();

编辑我错过了你已经声明并初始化了指针*canQueuefunction scope不是file scope。这违背了 a 的定义。global variable但是还有一个问题。如果你在文件范围内声明类似的东西LinkedList *canQueue=createList();,你会得到以下错误:

     Initializer element not constant

由于对象将在文件范围内“声明”,因此它具有静态存储持续时间。静态存储持续时间的对象的初始化程序必须是常量表达式。函数调用的结果不是常量表达式

于 2013-05-03T07:36:07.307 回答