如何在C语言中从另一个头文件中使用已定义的结构体?

5

我有两个头文件,stack.h

#ifndef __STACK_H__
#define __STACK_H__



typedef struct StackElement_
{
  int value;
  struct StackElement_ *next;
} StackElement, *Stack;


/*----------------------Prototypes----------------------*/

Stack new_stack();

void push_to_stack(Stack *, int);
int pop_stack(Stack *);
int peek_stack(Stack);

int stack_length(Stack);
void print_stack(Stack);
Bool is_empty_stack(Stack);

void clear_stack(Stack);

/*------------------------------------------------------*/



#endif

以及utils.h

#ifndef __UTILS_H__
#define __UTILS_H__



#define INT_MIN -2147483648

/*------------------------Typedef-----------------------*/

typedef enum Boolean_ {
  FALSE,
  TRUE
} Bool;

/*------------------------------------------------------*/



#endif

在stack.h中,我需要知道Bool,但是当我在stack.c中包含utils.h时,在stack.h中仍然不知道该结构。如何做到这一点,而不必直接在stack.h中进行定义?

我有同样的问题很长一段时间了,很高兴找到了你的帖子。答案非常好,我的问题在几秒钟内得到了解决。真的非常感激!!! - Esha
2个回答

3

您需要在stack.h中包含utils.h。 #include语句是C宏语言的一部分,它是一个简单的预处理器。它会将给定文件(#include filename)插入到程序中(在编译的预处理阶段)。


2

一个源文件或包含文件应该包括所有必要的文件。

因此,如果stack.h依赖于util.h中的声明,则应在stack.h中#include "util.h"。这样,任何包含stack.h的模块都不需要担心同时包含util.h并将其放置在正确的位置。

如果一个模块决定同时包含两个文件那也没问题。您添加的include guards可以解决这个问题。

您没有展示stack.c的源代码,但是您很可能在util.h之前包含了stack.h。这就解释了您的问题,因为stack.h所需的定义出现在它们之后而不是之前。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接