Заголовочный файл — это файл с расширением .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.