Как использовать структуру, определенную в определенном заголовочном файле из другого заголовка в C? - PullRequest
4 голосов
/ 11 ноября 2019

У меня есть два файла заголовков: 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, но когда я включаю utils. h в stack.c, структура все еще не известна в stack.h. Как сделать это, не определяя его непосредственно в stack.h?

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Вам необходимо включить utils.h в стек .h (не в stack.c). Операторы #include являются частью макроязыка C, который является простым препроцессором. Он буквально берет файл, указанный в качестве имени файла (#include filename ), и вставляет его в вашу программу (на этапе предварительной обработки компиляции).

1 голос
/ 11 ноября 2019

Исходный файл или включаемый файл должны включать все необходимые файлы.

Так что, если stack.h зависит от объявлений в util.h, то вам следует #include "util.h" в stack.h. Таким образом, любой модуль, который включает в себя stack.h, не должен беспокоиться о включении util.h и размещении его в правильном порядке.

Если модуль решает включить и то, и другое, это тоже хорошо. Добавленные вами стражи включения должны решить эту проблему.

Вы не указали источник stack.c, но, скорее всего, включили stack.h перед util.h. Это объясняет вашу проблему, поскольку определения, необходимые для stack.h, появляются после них, а не до.

...