liststructs.h:
struct _data_object {
int temp;
int interval_length;
};
typedef struct _data_object temp_data_object;
struct _list_node {
data_object *temp_data;
struct _list_node *prev;
struct _list_node *next;
};
typedef struct _list_node list_node;
struct _list {
int time;
list_node *head;
list_node *tail;
};
typedef struct _list list;
list.h:
list_node *alloc_node(int temp, int interval_length);
list_node *alloc_dummy_node(void);
list *alloc_temp_list(void);
void delete_first(list *list);
void insert_node(list *list, list_node *new_node);
void insert(list *list, int temperature, int interval);
然后我在另一个名为calculations.c
和main.c
的文件中使用它,但随后我在calculations.h
中声明extern list *xs;
(它在calculations.c
中定义),它抱怨:Error[Pe020]: identifier "list" is undefined
我在calculations.c
和main.c
中按顺序包含了liststructs.h
和list.h
,并希望在calculations
和main
中使用xs
。
也:哪个更好?有结构体和列表操作声明在同一个头或分开它们?
用#include
保护您的包含文件,在list.h
中包含liststructs.h
,在calculations.h
中包含两个文件。头文件中的保护措施通常写成:
#ifndef _XXXX_H_ // XXXX = LIST, LISTSTRUCT etc
#define _XXXX_H_
// definitions for file XXXX.h
#endif /* _XXXX_H_ */
从您告诉我们的,您在calculations.h
中声明了extern list *xs;
,但没有提到在定义标识符list
的行之前包含了liststructs.h
。
liststructs.h
需要在使用标识符list
之前的任何地方包含,就像list.h
必须在尝试调用它声明的任何函数之前包含一样。
只要你有include/header保护符,就不用担心在翻译单元中多次包含头文件