从公共文件编译具有底层函数的多个C文件

时间:2015-04-18 04:43:22

标签: c compiler-errors

我仔细检查了所有StackOverflow线程,但找不到符合我问题的线程。 我正在尝试实现不同的数据结构(在stack.cqueue.c中实现),从另一个文件storage.c获取基本功能。这是他们的头文件 -

storage.h定义

typedef struct _circular_list
{
     int *array, head, tail;
     size_t size, count;
} circular_list;
typedef circular_list *clist;

clist Initialize(size_t);
clist WriteAtTail(clist, int);
int RemoveAtHead(clist);
int RemoveAtTail(clist);
clist WriteAtHead(clist, int)

stack.h

#include "storage.h"
#define stack clist
#define push(s, i) WriteAtTail(s, i)
int pop(stack);
int popKey(stack, int);

queue.h

#define queue clist
#define EnQueue(q,i) WriteAtTail(q,i)
#define DeQueue(q) RemoveAtHead(q)

我将它们包含在主C文件中

driver.c

#include <stdio.h>
#include "stack.h"
#include "queue.h"

现在,如果我尝试使用

编译它们

gcc -o driver driver.c storage.c stack.c queue.c

我在unknown type name 'clist'中收到错误queue.h

如果我尝试在queue.h中包含storage.h,我会收到一个错误,我对该结构有多个声明。

我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

如果在stack.h或queue.h中没有包含storage.h,则必须在包含其他文件之前将其包含在driver.c文件中。否则编译器不知道storage.h的声明。

更好的解决方案是直接在stack.h和queue.h中包含storage.h。为避免因多个声明而导致编译器错误,您必须更改storage.h,如下所示:

#if !defined(INC_STORAGE_H)
#define INC_STORAGE_H

/* original storage.h contents go here */

#endif /* INC_STORAGE_H */

如果您的编译器支持,只需在storage.h的开头写#pragma once即可。 (如果您正在为其他人编写图书馆,我建议使用第一个解决方案)