Учебники

C — Заголовочные файлы

Заголовочный файл — это файл с расширением .h, который содержит объявления функций C и определения макросов для совместного использования несколькими исходными файлами. Существует два типа заголовочных файлов: файлы, которые пишет программист, и файлы, поставляемые с вашим компилятором.

Вы просите использовать файл заголовка в своей программе, включив его в директиву предварительной обработки C #include , как вы видели включение заголовочного файла stdio.h , который поставляется вместе с вашим компилятором.

Включение файла заголовка равнозначно копированию содержимого файла заголовка, но мы этого не делаем, потому что это будет подвержено ошибкам, и не стоит копировать содержимое файла заголовка в исходные файлы, особенно если мы иметь несколько исходных файлов в программе.

Простая практика в программах на C или C ++ заключается в том, что мы сохраняем все константы, макросы, глобальные переменные в масштабе всей системы и прототипы функций в заголовочных файлах и включаем этот заголовочный файл везде, где это требуется.

Включить синтаксис

И пользовательские, и системные заголовочные файлы включаются с использованием директивы предварительной обработки #include . Он имеет следующие две формы —

#include <file>

Эта форма используется для системных заголовочных файлов. Он ищет файл с именем «file» в стандартном списке системных каталогов. Вы можете добавить каталоги к этому списку с помощью опции -I при компиляции исходного кода.

#include "file"

Эта форма используется для заголовочных файлов вашей собственной программы. Он ищет файл с именем «file» в каталоге, содержащем текущий файл. Вы можете добавить каталоги к этому списку с помощью опции -I при компиляции исходного кода.

Включить операцию

Директива #include работает, заставляя препроцессор C сканировать указанный файл в качестве входных данных, прежде чем продолжить работу с остальной частью текущего исходного файла. Выходные данные препроцессора содержат уже сгенерированные выходные данные, за которыми следуют выходные данные из включенного файла, а затем выходные данные из текста после директивы #include . Например, если у вас есть файл заголовка header.h как показано ниже:

char *test (void);

и основная программа с именем program.c, которая использует заголовочный файл, например:

int x;
#include "header.h"

int main (void) {
   puts (test ());
}

компилятор увидит тот же поток токенов, что и при чтении program.c

int x;
char *test (void);

int main (void) {
   puts (test ());
}

Заголовки только один раз

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

#ifndef HEADER_FILE
#define HEADER_FILE

the entire header file file

#endif

Эта конструкция широко известна как оболочка #ifndef . Когда заголовок включается снова, условное будет ложным, потому что определено HEADER_FILE. Препроцессор пропустит все содержимое файла, и компилятор не увидит его дважды.

Вычисляется Включает

Иногда необходимо выбрать один из нескольких различных заголовочных файлов для включения в вашу программу. Например, они могут указывать параметры конфигурации, которые будут использоваться в разных типах операционных систем. Вы можете сделать это с помощью ряда условий:

#if SYSTEM_1
   # include "system_1.h"
#elif SYSTEM_2
   # include "system_2.h"
#elif SYSTEM_3
   ...
#endif

Но по мере роста он становится утомительным, вместо этого препроцессор предлагает возможность использовать макрос для имени заголовка. Это называется вычисленным включением . Вместо того, чтобы писать имя заголовка в качестве прямого аргумента #include , вы просто помещаете туда имя макроса —

#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H

SYSTEM_H будет расширен, и препроцессор будет искать system_1.h, как если бы изначально был написан #include . SYSTEM_H может быть определен вашим Makefile с опцией -D.