Подключение констант из заголовочного файла
Имеется заголовочный файл Constants.h, в котором определены константы.
SS_INF_ROOTS используется в main. Тип Bool используется в main и в другом заголовочном файле Functions.h, в котором определены прототипы функций, а также в файлах .с, в которых содержатся функции.
Constants.h:
#ifndef Functions_h
#define Functions_h
const int SS_INF_ROOTS = -1;
typedef enum Bool {
FALSE,
TRUE
} Bool;
#endif
Файл Functions.h с прототипами функций:
#ifndef Functions_h
#define Functions_h
double checkDoubleOverflow(double d1, double d2, int x);
void nCheckDouble (double a, double b, double c,
double *x1, double *x2);
Bool EqualZero (double d);
void LinSolve (double a, double b, double *x1);
int SquareSolve (double a, double b, double c,
double *x1, double *x2);
#endif
Далее происходит ошибка идентификатор "Bool" не определен.
Как надо подключить заголовочный файл Constans.h, чтобы константы и типы объявленных в днем данных работали в файлах .с, где хранятся функции и в другом заголовочном файле Functions.h? Компилятор gcc.
Ответы (1 шт):
Для ускорения компиляции больших проектов хедеры разделены по частям. Какая-то часть пользуется одним, какая-то другим. В хедерах присутсвует блокировка повторной обработки с помощью макросов. Без этой блокировке могут быть ошибки повторного объявления структур.
Ошибка первая : макросы у разных файлов должны быть разными.
Ошибка вторая : в предварительном объявлении функций не подключили объявление типа Bool.
Ошибка третья : объявление переменных не должны быть в хедерах. При компиляции второго файла будет конфликт, что переменная ещё одна появилась с таким-же именем.
Вот рабочий пример самой растянутой реализации :
type.h :
#ifndef Type_h
#define Type_h
typedef enum Bool Bool;
#endif
constants.h :
#ifndef Constants_h
#define Constants_h
extern const int SS_INF_ROOTS ;
enum Bool {
FALSE,
TRUE
} ;
#endif
functions.h :
#ifndef Functions_h
#define Functions_h
double checkDoubleOverflow(double d1, double d2, int x);
void nCheckDouble (double a, double b, double c,
double *x1, double *x2);
# include "type.h"
Bool EqualZero (double d);
void LinSolve (double a, double b, double *x1);
int SquareSolve (double a, double b, double c,
double *x1, double *x2);
#endif
const.c :
# include "constants.h"
const int SS_INF_ROOTS = -1;
main.c :
# include "constants.h"
# include "functions.h"
int main(){
int i = SS_INF_ROOTS ;
}