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ожидание |