如何在另一个C文件中引用变量?

时间:2017-10-09 12:46:48

标签: c struct linked-list

我在一个名为list.c的C文件中有一个变量,我在main.c中用函数initList(void)初始化var。如何在main.c中获取变量?

main.c中:

#include <stdlib.h>
#include "list.h"

int main() {
    initList();
    return 0;
}

list.c:

#include "list.h"

listItem *firstItem;
listItem *currentItem;

void initList(void) {
    currentItem = calloc(1, sizeof(listItem));
    currentItem->data = 0;
    currentItem->lastItem = NULL;
    currentItem->nextItem = NULL;
    firstItem = currentItem;
}
void listInsert(int data) {
    listItem *newItem = calloc(1, sizeof(listItem));
    newItem->data = data;
    newItem->lastItem = currentItem;
    newItem->nextItem = NULL;
    currentItem = newItem;
}

list.h:

#ifndef LINKEDLIST_H
#define LINKEDLIST_H

void initList(void);
void listInsert(int data);

typedef struct listItem {
    void *lastItem;
    void *nextItem;
    int data;
} listItem;

#endif 

正如您所看到的,我在init.c(void)函数中初始化变量,我在main.c文件中调用该函数。现在我想用我的变量做点什么。例如,我想用我的函数listInsert(int data)在列表中插入一些不起作用的东西。

C是否不保留对我的变量firstItem,currentItem?

的引用

2 个答案:

答案 0 :(得分:3)

在main.c中你必须把它:

extern listItem *firstItem;
extern listItem *currentItem;

这将让编译器知道在其他.c文件中声明了两个变量firstItemfirstItem

SO Article详细说明了extern关键字。

修改
但是在这里使用extern很可能是不好的做法,因为你的整个程序中只能有一个链表。

答案 1 :(得分:0)

声明&#39; head&#39;标题中包含extern

的列表

建议重新设计currentItem变量,&#39;当前&#39;特定于每个算法

#ifndef PRAKTIKUM_1_LINKEDLIST_H

#define PRAKTIKUM_1_LINKEDLIST_H

extern listItem *firstItem;  // usually named 'head'

// bad pracite, local for concrete algoritm 
// listItem *currentItem;

void initList(void);
void listInsert(int data);

typedef struct listItem {
    void *lastItem;
    void *nextItem;
    int data;
} listItem;

#endif //PRAKTIKUM_1_LINKEDLIST_H

以及对功能的建议

void initList(void) {
    listItem *currentItem;
...
}
void listInsert(int data) {
listItem *currentItem;
..
}