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 ());
}

Компилятор увидит следующий код:

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 — это набор заголовочных файлов, определённых стандартами ANSI C (также известным как C89/C90) и ISO C (C99 и C11). Эти заголовочные файлы предоставляют большое количество функций, макросов и определений типов для распространённых задач программирования, таких как ввод/вывод, операции со строками, математические вычисления, управление памятью и так далее.

Ниже приведены некоторые распространённые заголовочные файлы стандартной библиотеки C и краткое описание их функций:

Заголовочный файл Описание функций
<stdio.h> библиотека стандартного ввода/вывода, содержащаяprintf、scanfи другие функции
<stdlib.h> Функции стандартной библиотеки, включая такие функции, как выделение памяти и управление программой.
<string.h> функции обработки строк, такие какstrlen、strcpyожидание
<math.h> Библиотеки математических функций, такие какsin、cos、sqrtожидание
<time.h> функции времени и даты, такие какtime、strftimeожидание
<ctype.h> функции обработки символов, такие какisalpha、isdigitожидание
<limits.h> определяет предельные значения для различных типов, таких какINT_MAXожидание
<float.h> определяет предельные значения для типов с плавающей запятой, таких какFLT_MAXожидание
<assert.h> Макрос утвержденияassert, для отладочных проверок
<errno.h> Определяет переменные кода ошибкиerrnoи связанные макросы
<stddef.h> определяет общие типы и макросы, такие какsize_t、NULLожидание
<signal.h> функции и макросы для обработки сигналов, такие какsignalожидание
<setjmp.h> макросы и функции, обеспечивающие функциональность нелокальных переходов
<locale.h> Функции и макросы, связанные с локалью, такие какsetlocaleожидание
Другие расширения