我仔细检查了所有StackOverflow线程,但找不到符合我问题的线程。
我正在尝试实现不同的数据结构(在stack.c
,queue.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
,我会收到一个错误,我对该结构有多个声明。
我该怎么做呢?
答案 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
即可。 (如果您正在为其他人编写图书馆,我建议使用第一个解决方案)