<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://wikihandbk.com/ruwiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F%3A%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB</id>
	<title>Русская Википедия:Заголовочный файл - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://wikihandbk.com/ruwiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F%3A%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB"/>
	<link rel="alternate" type="text/html" href="http://wikihandbk.com/ruwiki/index.php?title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB&amp;action=history"/>
	<updated>2026-09-23T01:32:35Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>http://wikihandbk.com/ruwiki/index.php?title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB&amp;diff=9892710&amp;oldid=prev</id>
		<title>EducationBot: Новая страница: «{{Русская Википедия/Панель перехода}} В программировании '''заголовочный файл''' ({{lang-en|header file}}) или '''подключаемый файл''' — файл, содержимое которого автоматически добавляется препроцессором в исходный текст в том месте, где располагается некоторая...»</title>
		<link rel="alternate" type="text/html" href="http://wikihandbk.com/ruwiki/index.php?title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB&amp;diff=9892710&amp;oldid=prev"/>
		<updated>2023-08-17T14:22:10Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «{{Русская Википедия/Панель перехода}} В программировании &amp;#039;&amp;#039;&amp;#039;заголовочный файл&amp;#039;&amp;#039;&amp;#039; ({{lang-en|header file}}) или &amp;#039;&amp;#039;&amp;#039;подключаемый файл&amp;#039;&amp;#039;&amp;#039; — файл, содержимое которого автоматически добавляется &lt;a href=&quot;/ruwiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Препроцессор (страница не существует)&quot;&gt;препроцессором&lt;/a&gt; в &lt;a href=&quot;/ruwiki/index.php?title=%D0%98%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9_%D1%82%D0%B5%D0%BA%D1%81%D1%82&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Исходный текст (страница не существует)&quot;&gt;исходный текст&lt;/a&gt; в том месте, где располагается некоторая...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Русская Википедия/Панель перехода}}&lt;br /&gt;
В программировании '''заголовочный файл''' ({{lang-en|header file}}) или '''подключаемый файл''' — файл, содержимое которого автоматически добавляется [[препроцессор]]ом в [[исходный текст]] в том месте, где располагается некоторая [[Директива (программирование)|директива]] (&amp;lt;code&amp;gt;{$I file.inc}&amp;lt;/code&amp;gt; в [[Паскаль (язык программирования)|Паскале]], &amp;lt;code&amp;gt;#include &amp;amp;lt;file.h&amp;amp;gt;&amp;lt;/code&amp;gt; в Си).&lt;br /&gt;
&lt;br /&gt;
В языках программирования [[Си (язык программирования)|Си]] и [[C++]] заголовочные файлы — основной способ подключить к программе [[Тип данных|типы данных]], структуры, [[Прототип функции|прототипы функций]], [[Перечисляемый тип|перечисляемые типы]] и [[макрос]]ы, используемые в другом модуле. [[По умолчанию]] используется [[Расширение имени файла|расширение]] ''.h''; иногда для заголовочных файлов языка [[C++]] используют расширение ''.hpp''.&lt;br /&gt;
&lt;br /&gt;
Чтобы избежать повторного включения одного и того же кода, используются директивы &amp;lt;code&amp;gt;#ifndef, #define, #endif&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заголовочный файл в общем случае может содержать любые конструкции [[Язык программирования|языка программирования]], но на практике исполняемый код (за исключением [[C++#Необъектно-ориентированные возможности|inline-функций]] в [[C++]]) в заголовочные файлы не помещают. Например, [[идентификатор]]ы, которые должны быть объявлены более чем в одном файле, удобно описать в заголовочном файле, а затем его подключать по мере надобности. Подобным же образом работает [[Модульность (программирование)|модульность]] и в большинстве [[ассемблер]]ов.&lt;br /&gt;
&lt;br /&gt;
По сложившейся традиции, в заголовочных файлах объявляют функции [[стандартная библиотека|стандартной библиотеки]] [[Стандартная библиотека языка Си|Си]] и [[Стандартная библиотека C++|Си++]].&lt;br /&gt;
&lt;br /&gt;
В других языках (например, в [[Паскаль (язык программирования)|Паскале]]) применяется развитая система модулей. Но и в них заголовочные файлы имеют определённую ценность. Дело в том, что два файла (основной и заголовочный) сливаются в одну [[единица трансляции|единицу трансляции]], и поэтому заголовочный файл может содержать [[Директива препроцессора|директивы препроцессора]], незаконченные синтаксические конструкции.&lt;br /&gt;
&lt;br /&gt;
== Назначение ==&lt;br /&gt;
&lt;br /&gt;
В современных языках программирования программы составляются из [[модульное программирование|модулей]], компилируемых по отдельности. В связи с этим возникает вопрос: как указать, что [[подпрограмма]] или [[переменная (программирование)|переменная]] &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; определена в модуле &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;? Для этого существует несколько решений, в [[Си (язык программирования)|Си]] применено такое.&lt;br /&gt;
&lt;br /&gt;
В одной из [[единица компиляции|единиц компиляции]] (то есть &amp;lt;code&amp;gt;с&amp;lt;/code&amp;gt;-файле) описывается функция, например:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 int add(int a, int b)&lt;br /&gt;
 {&lt;br /&gt;
     return a + b;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Чтобы на неё можно было ссылаться из других единиц компиляции, требуется объявить её при помощи [[прототип функции|прототипа функции]], то есть:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 int add(int, int);&lt;br /&gt;
 &lt;br /&gt;
 int triple(int x)&lt;br /&gt;
 {&lt;br /&gt;
     return add(x, add(x, x));&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тем не менее, такое объявление требует, чтобы программист обеспечил объявление функции для &amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt; в двух местах — в файле, содержащем её реализацию, и в файле, в котором она используется. В случае изменения определения функции программист должен не забыть обновить все прототипы, использованные в программе.&lt;br /&gt;
&lt;br /&gt;
Заголовочный файл является одним из решений этой проблемы. В заголовочном файле [[Модуль (программирование)|модуля]] объявляется каждая [[Функция (программирование)|функция]], [[Объект (программирование)|объект]] и [[тип данных]], являющиеся частью ''интерфейса вызова'' модуля — например, в этом случае заголовочный файл может содержать только объявление функции &amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt;. Каждый исходный файл, ссылающийся на функцию &amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt;, должен использовать директиву &amp;lt;code&amp;gt;#include&amp;lt;/code&amp;gt; для подключения заголовочного файла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 /* File triple.c */&lt;br /&gt;
 #include &amp;quot;add.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 int triple(int x)&lt;br /&gt;
 {&lt;br /&gt;
     return add(x, add(x, x));&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Списки инициализированных констант в заголовочном файле выбираются [[препроцессор]]ом для замены их значением этих констант во включаемом файле. Включаемые функции заголовочного файла обрамляются [[include guard|директивами макрозащиты]] препроцессора для избежания их дублирования во включающем файле (возникновение такой ситуации возможно при классовом или файловом [[Наследование (программирование)|наследовании]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 /* File add.h */&lt;br /&gt;
 #ifndef ADD_H&lt;br /&gt;
 #define ADD_H&lt;br /&gt;
 &lt;br /&gt;
 int add(int, int);&lt;br /&gt;
 &lt;br /&gt;
 #endif /* ADD_H */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме конструкции &amp;lt;code&amp;gt;#ifndef - #endif&amp;lt;/code&amp;gt; иногда применяется нестандартная &amp;lt;code&amp;gt;[[Pragma_once|#pragma once]]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 /* File add.h */&lt;br /&gt;
 #pragma once&lt;br /&gt;
&lt;br /&gt;
 int add(int, int);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заголовочные файлы облегчают поддержку — при изменении определения должно быть обновлено лишь одно [[Объявление (информатика)|объявление]] (то, которое находится в заголовочном файле). К исходному файлу также можно подключать заголовочный файл, содержащий определения, используемые в исходниках. Это позволяет компилятору сверять, совпадает ли объявление в &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;-файле с определением в &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;-файле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 /* File add.c */&lt;br /&gt;
 #include &amp;quot;add.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 int add(int a, int b)&lt;br /&gt;
 {&lt;br /&gt;
     return a + b;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обычно заголовочные файлы применяются только для более чёткого определения [[интерфейс]]а и обычно содержат комментарии, поясняющие способы использования [[Компонентно-ориентированное программирование|компонентов]], объявленных в файле. В приведённом примере использованные подпрограммы выделены в отдельные исходные файлы, которые должны компилироваться отдельно (исключением в языках [[Си (язык программирования)|C]] и [[C++]] являются [[встраиваемая функция|встраиваемые функции]], которые зачастую включаются в заголовочный файл из-за того, что в большинстве случаев использования не получается правильно раскрыть встраиваемую функцию без обращений к их определению во время [[Компиляция во время выполнения|компиляции]]).&lt;br /&gt;
&lt;br /&gt;
== Сравнение с прямым получением заголовков из откомпилированного модуля ==&lt;br /&gt;
&lt;br /&gt;
Альтернатива заголовочным файлам — получение информации об объявленных типах, функциях и т. д. напрямую из откомпилированного модуля. Так поступают языки [[Паскаль (язык программирования)|Паскаль]], [[Java]] и другие.&lt;br /&gt;
&lt;br /&gt;
=== Преимущества ===&lt;br /&gt;
&lt;br /&gt;
Преимущество заголовочных файлов в первую очередь в упрощении компилятора: без заголовочных файлов [[компилятор]] и [[компоновщик]] делают одну и ту же работу, проверяя, есть ли в модуле &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; откомпилированная функция &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если модуль правильно написан, с помощью [[условная компиляция|условной компиляции]] можно отключить часть его функциональности. Например, в данном случае мы отказываемся от прикомпоновывания к программе огромной библиотеки [[стандартная библиотека шаблонов|STL]]:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// unit.h&lt;br /&gt;
#ifndef __UNIT_H__&lt;br /&gt;
#define __UNIT_H__&lt;br /&gt;
&lt;br /&gt;
#ifndef UNIT_STL_UNUSED&lt;br /&gt;
  #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
  void dump(std::ostream&amp;amp; os);&lt;br /&gt;
  void dump() { dump(std::cout); }&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
void run();&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// main.cpp&lt;br /&gt;
&lt;br /&gt;
#define UNIT_STL_UNUSED&lt;br /&gt;
#include &amp;quot;unit.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  run();&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае, если модуль распространяется уже откомпилированным (библиотека), заголовочный файл будет одновременно [[Документация на программное обеспечение|документацией]] по пользованию модулем.&lt;br /&gt;
&lt;br /&gt;
Если программист исправил реализацию функции в &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;-файле, не тронув заголовка, это не вызовет каскадной перекомпиляции всех модулей, которые используют данный заголовок.&lt;br /&gt;
&lt;br /&gt;
Заголовочный файл позволяет задать то, что невозможно задать с помощью модулей — подстановки с помощью &amp;lt;code&amp;gt;#define&amp;lt;/code&amp;gt;, [[директивы компилятора]], незаконченные синтаксические конструкции…&lt;br /&gt;
&lt;br /&gt;
Упрощается взаимодействие между модулями, написанными на разных языках. Компилятору и компоновщику вообще безразлично, написан вызываемый модуль на том же языке или на другом. К тому же разные языки могут скомпилировать свои модули в одинаковые объектные файлы — в таком случае получается один компоновщик на несколько языков. Точно так же просто сделать библиотеку, которая по выбору пользователя включается в проект в виде CPP-файлов, хранится заранее откомпилированной и прикомпоновывается статически, или прикомпоновывается как [[DLL]].&lt;br /&gt;
&lt;br /&gt;
=== Недостатки ===&lt;br /&gt;
Заголовочные файлы намного медленнее — чтобы откомпилировать 10 &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;-файлов, к каждому из которых подключён длинный &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;-файл, компилятору придётся пройти по заголовку 10 раз. Чтобы справиться с этой проблемой, во многих компиляторах используют [[предварительно откомпилированные заголовки]].&lt;br /&gt;
&lt;br /&gt;
Заголовочные файлы вместе с некоторыми объектами языка C++ ([[константа (программирование)|константы]], &amp;lt;code&amp;gt;[[встраиваемая функция|inline]]&amp;lt;/code&amp;gt;-функции, [[шаблоны C++|шаблоны]], &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;-переменные) образуют тяжеловесные конструкции.&lt;br /&gt;
&lt;br /&gt;
Программист должен синхронно менять заголовки функций в двух местах. Если вдруг он изменил &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;-файл, забыв сделать то же с &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;-файлом, компоновщик выдаст расплывчатое сообщение об ошибке без номера строки. Особенно это заметно в [[C++]], где одна и та же функция [[перегрузка функций|может иметь разный набор аргументов]], и проверка на уровне компилятора не срабатывает. Если программист случайно оставит конструкцию в &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;-файле незаконченной, ошибка будет совсем в другом &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;- или &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;-файле.&lt;br /&gt;
&lt;br /&gt;
Проектам из языков семейства Си свойственны сложные схемы сборки проекта. Ведь (как минимум в стандартном C++) надо включить в проект библиотеку — либо в виде CPP-файлов, либо в откомпилированном виде. Даже если (например, в Visual C++) для этого есть директивы препроцессора, библиотеку всё равно придётся собрать.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Стандартная библиотека языка Си]] — описывает стандартные заголовочные файлы языка Си&lt;br /&gt;
* [[Стандартная библиотека языка C++]] — описывает стандартные заголовочные файлы языка Си++&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* http://www.citforum.ru/programming/cpp/gl4.shtml {{Wayback|url=http://www.citforum.ru/programming/cpp/gl4.shtml |date=20070611154725 }}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга&lt;br /&gt;
 |автор          = Подбельский В. В.&lt;br /&gt;
 |часть          = Глава 8. Препроцессорные средства&lt;br /&gt;
 |заглавие       = Язык Си++&lt;br /&gt;
 |оригинал       = &lt;br /&gt;
 |ссылка         = &lt;br /&gt;
 |ответственный  = рец. Дадаев Ю. Г.&lt;br /&gt;
 |издание        = 4&lt;br /&gt;
 |место          = М.&lt;br /&gt;
 |издательство   = [[АСТ (издательство)|Финансы и статистика]]&lt;br /&gt;
 |год            = 2003&lt;br /&gt;
 |том            = &lt;br /&gt;
 |страницы       = 263-280&lt;br /&gt;
 |страниц        = 560&lt;br /&gt;
 |серия          = &lt;br /&gt;
 |isbn           = 5-279-02204-7, УДК 004.438Си(075.8) ББК 32.973.26-018 1я173&lt;br /&gt;
 |тираж          = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Язык программирования Си}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Язык программирования Си]]&lt;br /&gt;
[[Категория:Статьи с примерами кода Си]]&lt;br /&gt;
[[Категория:C++]]&lt;br /&gt;
{{Навигационная таблица/Портал/Русская Википедия}}&lt;br /&gt;
[[Категория:Русская Википедия]]&lt;br /&gt;
[[Категория:Википедия]]&lt;br /&gt;
[[Категория:Статья из Википедии]]&lt;br /&gt;
[[Категория:Статья из Русской Википедии]]&lt;/div&gt;</summary>
		<author><name>EducationBot</name></author>
	</entry>
</feed>