C — заголовочные файлы
Заголовочный файл — это файл с расширением .h. который содержит объявления функций C и определения макросов для совместного использования несколькими исходными файлами. Существует два типа заголовочных файлов:файлы, которые пишет программист, и файлы, поставляемые с вашим компилятором.
Вы запрашиваете использование заголовочного файла в своей программе, включая его с помощью директивы препроцессора C #include. , как вы видели включение stdio.h заголовочный файл, который поставляется вместе с вашим компилятором.
Включение заголовочного файла равносильно копированию содержимого заголовочного файла, но мы этого не делаем, поскольку это чревато ошибками, а копировать содержимое заголовочного файла в исходные файлы не рекомендуется, особенно если мы иметь несколько исходных файлов в программе.
Простая практика в программах C или C++ заключается в том, что мы храним все константы, макросы, системные глобальные переменные и прототипы функций в файлах заголовков и включаем этот файл заголовка везде, где это необходимо.
Включить синтаксис
И пользовательские, и системные заголовочные файлы включаются с помощью директивы предварительной обработки #include. . Он имеет следующие две формы —
#include <file>
Эта форма используется для системных заголовочных файлов. Он ищет файл с именем «файл» в стандартном списке системных каталогов. Вы можете добавить каталоги в этот список с опцией -I во время компиляции исходного кода.
#include "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.
Язык C