Заголовочный файл

В программировании заголовочный файл (англ. header file) или подключаемый файл — файл, содержимое которого автоматически добавляется препроцессором в исходный текст в том месте, где располагается некоторая директива ({$I file.inc} в Паскале, #include <file.h> в Си).

В языках программирования Си и C++ заголовочные файлы — основной способ подключить к программе типы данных, структуры, прототипы функций, перечисляемые типы и макросы, используемые в другом модуле. По умолчанию используется расширение .h; иногда для заголовочных файлов языка C++ используют расширение .hpp.

Чтобы избежать повторного включения одного и того же кода, используются директивы #ifndef, #define, #endif.

Заголовочный файл в общем случае может содержать любые конструкции языка программирования, но на практике исполняемый код (за исключением inline-функций в C++) в заголовочные файлы не помещают. Например, идентификаторы, которые должны быть объявлены более чем в одном файле, удобно описать в заголовочном файле, а затем его подключать по мере надобности. Подобным же образом работает модульность и в большинстве ассемблеров.

По сложившейся традиции, в заголовочных файлах объявляют функции стандартной библиотеки Си и Си++.

В других языках (например, в Паскале) применяется развитая система модулей. Но и в них заголовочные файлы имеют определённую ценность. Дело в том, что два файла (основной и заголовочный) сливаются в одну единицу трансляции, и поэтому заголовочный файл может содержать директивы препроцессора, незаконченные синтаксические конструкции.

Назначение

В современных языках программирования программы составляются из модулей, компилируемых по отдельности. В связи с этим возникает вопрос: как указать, что подпрограмма или переменная X определена в модуле Y? Для этого существует несколько решений, в Си применено такое.

В одной из единиц компиляции (то есть с-файле) описывается функция, например:

 int add(int a, int b)
 {
     return a + b;
 }

Чтобы на неё можно было ссылаться из других единиц компиляции, требуется объявить её при помощи прототипа функции, то есть:

 int add(int, int);
 
 int triple(int x)
 {
     return add(x, add(x, x));
 }

Тем не менее, такое объявление требует, чтобы программист обеспечил объявление функции для add в двух местах — в файле, содержащем её реализацию, и в файле, в котором она используется. В случае изменения определения функции программист должен не забыть обновить все прототипы, использованные в программе.

Заголовочный файл является одним из решений этой проблемы. В заголовочном файле модуля объявляется каждая функция, объект и тип данных, являющиеся частью интерфейса вызова модуля — например, в этом случае заголовочный файл может содержать только объявление функции add. Каждый исходный файл, ссылающийся на функцию add, должен использовать директиву #include для подключения заголовочного файла:

 /* File triple.c */
 #include "add.h"
 
 int triple(int x)
 {
     return add(x, add(x, x));
 }

Списки инициализированных констант в заголовочном файле выбираются препроцессором для замены их значением этих констант во включаемом файле. Включаемые функции заголовочного файла обрамляются директивами макрозащиты препроцессора для избежания их дублирования во включающем файле (возникновение такой ситуации возможно при классовом или файловом наследовании):

 /* File add.h */
 #ifndef ADD_H
 #define ADD_H
 
 int add(int, int);
 
 #endif /* ADD_H */

Кроме конструкции #ifndef - #endif иногда применяется нестандартная #pragma once:

 /* File add.h */
 #pragma once

 int add(int, int);

Заголовочные файлы облегчают поддержку — при изменении определения должно быть обновлено лишь одно объявление (то, которое находится в заголовочном файле). К исходному файлу также можно подключать заголовочный файл, содержащий определения, используемые в исходниках. Это позволяет компилятору сверять, совпадает ли объявление в h-файле с определением в c-файле:

 /* File add.c */
 #include "add.h"
 
 int add(int a, int b)
 {
     return a + b;
 }

Обычно заголовочные файлы применяются только для более чёткого определения интерфейса и обычно содержат комментарии, поясняющие способы использования компонентов, объявленных в файле. В приведённом примере использованные подпрограммы выделены в отдельные исходные файлы, которые должны компилироваться отдельно (исключением в языках C и C++ являются встраиваемые функции, которые зачастую включаются в заголовочный файл из-за того, что в большинстве случаев использования не получается правильно раскрыть встраиваемую функцию без обращений к их определению во время компиляции).

Сравнение с прямым получением заголовков из откомпилированного модуля

Альтернатива заголовочным файлам — получение информации об объявленных типах, функциях и т. д. напрямую из откомпилированного модуля. Так поступают языки Паскаль, Java и другие.

Преимущества

Преимущество заголовочных файлов в первую очередь в упрощении компилятора: без заголовочных файлов компилятор и компоновщик делают одну и ту же работу, проверяя, есть ли в модуле Y откомпилированная функция X.

Если модуль правильно написан, с помощью условной компиляции можно отключить часть его функциональности. Например, в данном случае мы отказываемся от прикомпоновывания к программе огромной библиотеки STL:

// unit.h
#ifndef __UNIT_H__
#define __UNIT_H__

#ifndef UNIT_STL_UNUSED
  #include <iostream>
  void dump(std::ostream& os);
  void dump() { dump(std::cout); }
#endif

void run();

#endif
// main.cpp

#define UNIT_STL_UNUSED
#include "unit.h"

int main()
{
  run();
  return 0;
}

В случае, если модуль распространяется уже откомпилированным (библиотека), заголовочный файл будет одновременно документацией по пользованию модулем.

Если программист исправил реализацию функции в c-файле, не тронув заголовка, это не вызовет каскадной перекомпиляции всех модулей, которые используют данный заголовок.

Заголовочный файл позволяет задать то, что невозможно задать с помощью модулей — подстановки с помощью #define, директивы компилятора, незаконченные синтаксические конструкции…

Упрощается взаимодействие между модулями, написанными на разных языках. Компилятору и компоновщику вообще безразлично, написан вызываемый модуль на том же языке или на другом. К тому же разные языки могут скомпилировать свои модули в одинаковые объектные файлы — в таком случае получается один компоновщик на несколько языков. Точно так же просто сделать библиотеку, которая по выбору пользователя включается в проект в виде CPP-файлов, хранится заранее откомпилированной и прикомпоновывается статически, или прикомпоновывается как DLL.

Недостатки

Заголовочные файлы намного медленнее — чтобы откомпилировать 10 c-файлов, к каждому из которых подключён длинный h-файл, компилятору придётся пройти по заголовку 10 раз. Чтобы справиться с этой проблемой, во многих компиляторах используют предварительно откомпилированные заголовки.

Заголовочные файлы вместе с некоторыми объектами языка C++ (константы, inline-функции, шаблоны, static-переменные) образуют тяжеловесные конструкции.

Программист должен синхронно менять заголовки функций в двух местах. Если вдруг он изменил c-файл, забыв сделать то же с h-файлом, компоновщик выдаст расплывчатое сообщение об ошибке без номера строки. Особенно это заметно в C++, где одна и та же функция может иметь разный набор аргументов, и проверка на уровне компилятора не срабатывает. Если программист случайно оставит конструкцию в h-файле незаконченной, ошибка будет совсем в другом c- или h-файле.

Проектам из языков семейства Си свойственны сложные схемы сборки проекта. Ведь (как минимум в стандартном C++) надо включить в проект библиотеку — либо в виде CPP-файлов, либо в откомпилированном виде. Даже если (например, в Visual C++) для этого есть директивы препроцессора, библиотеку всё равно придётся собрать.

См. также

Ссылки

Литература

  • Подбельский В. В. Глава 8. Препроцессорные средства // Язык Си++ / рец. Дадаев Ю. Г.. — 4. — М.: Финансы и статистика, 2003. — С. 263-280. — 560 с. — ISBN 5-279-02204-7, УДК 004.438Си(075.8) ББК 32.973.26-018 1я173.

Read other articles:

PraySutradaraYuichi SatoProduserTakeshi MoriyaToshinori NishimaeDitulis olehTomoko OgawaPemeranTetsuji TamayamaAsami MizukawaMitsuyoshi ShinodaKatsuya KobayashiToshiyuki ToyonagaErika AsakuraEi MorisakoSanae MiyataFumiyo KohinataSinematograferAkihiro KawamuraPenyuntingYoshifumi FukazawaDistributor Atmovie Japan Tartan FilmsTanggal rilis15 Oktober 2005Durasi77 menitNegara JepangBahasaJepangIMDbInformasi di IMDb Pray (絶対恐怖プレイcode: ja is deprecated , Zettai Kyōfu Purei) adalah seb...

 

Manuela Rüf Nazionalità  Austria Sci alpino Specialità Discesa libera, supergigante, slalom gigante, slalom speciale Squadra SC Hard[1] Termine carriera 1987 Palmarès Trofeo Vittorie Coppa Europa 1 trofeo Per maggiori dettagli vedi qui   Modifica dati su Wikidata · Manuale Manuela Rüf (11 giugno 1966) è un'ex sciatrice alpina austriaca, vincitrice della Coppa Europa nel 1986. Indice 1 Biografia 2 Palmarès 2.1 Coppa del Mondo 2.2 Coppa Europa 3 Note 4 Collegamen...

 

This article is about the 2005 docudrama TV show. For the 1978 animated TV show, see Yogi's Space Race. For the 2014 animated TV show, see Space Racers. For other uses, see Space race (disambiguation). British TV series or programme Space RaceBBC DVD CoverGenreDocudramaWritten byChristopher SpencerDirected byChristopher SpencerMark EverestStarringRichard DillaneJohn WarnabyRavil IsyanovNarrated byRobert LindsayComposersSamuel SimTy UnwinCountry of originUnited KingdomOriginal languageEnglishN...

Sekolah Tinggi Ilmu Sosial dan Ilmu Politik (STISIPOL) Pahlawan 12 adalah sebuah perguruan tinggi swasta yang terletak di Sungailiat, Kabupaten Bangka, Provinsi Bangka Belitung. STISIPOL Pahlawan 12 berdiri pada tanggal 3 Maret 2007. Sejarah STISIPOL Pahlawan 12 didirikan pada tanggal 3 Maret 2007 dengan dikeluarkannya Keputusan Menteri Pendidikan Nasional Nomor: 35/D/0/2007 tentang Pendirian Program Studi Ilmu Komunikasi dan Program Studi Ilmu Administrasi Negara Sekolah Tinggi Ilmu Sosial d...

 

American mixed martial artist Beneil DariushDariush in 2018BornBeneil Khobier Dariush (1989-05-06) May 6, 1989 (age 34)Urmia, IranResidenceYorba Linda, California, U.S.NationalityAmericanHeight5 ft 10 in (178 cm)Weight155 lb (70 kg; 11 st 1 lb)DivisionLightweightReach72 in (183 cm)[1]StyleBrazilian Jiu-JitsuFighting out ofHuntington Beach, California, U.S.TeamKings MMATrainerRafael CordeiroRankBlack belt in Brazilian Jiu-Jitsu under R�...

 

Peta Kabupaten Tojo Una-Una di Sulawesi Tengah Berikut adalah daftar kecamatan dan kelurahan di Kabupaten Tojo Una-Una, Provinsi Sulawesi Tengah, Indonesia. Kabupaten Tojo Una-Una terdiri dari 12 kecamatan, 12 kelurahan, dan 134 desa dengan luas wilayah 5.721,15 km² dan jumlah penduduk sebesar 155.885 jiwa dengan sebaran penduduk 27 jiwa/km².[1][2] Daftar kecamatan dan kelurahan di Kabupaten Tojo Una-Una, adalah sebagai berikut: Kode Kemendagri Kecamatan Jumlah Kelurahan Jum...

Disambiguazione – Se stai cercando altri significati, vedi Africa (disambigua). Questa voce o sezione sull'argomento Africa è priva o carente di note e riferimenti bibliografici puntuali. Commento: Larghe porzioni di testo o perfino intere sezioni senza alcun riferimento, bibliografia non inerente alle citazioni già presenti Sebbene vi siano una bibliografia e/o dei collegamenti esterni, manca la contestualizzazione delle fonti con note a piè di pagina o altri riferimenti precisi c...

 

Campagnatico Apse of the بيفي of San Giovanni Battista. شعار Campagnaticoشعار Campagnaticoشعار الاسم الرسمي Comune di Campagnatico   الإحداثيات 42°53′04″N 11°16′17″E / 42.884444444444°N 11.271388888889°E / 42.884444444444; 11.271388888889   [1] تقسيم إداري  البلد إيطاليا[2]  التقسيم الأعلى مقاطعة غروسيتو  خصائص جغرافية &...

 

2010 single by A-haButterfly, Butterfly (The Last Hurrah)Single by A-hafrom the album 25 B-sideButterfly, Butterfly (The Last Hurrah) (Steve Osborne Version)Released5 July 2010 (EU)20 September 2010 (UK)Recorded2010GenreSynthpop, alternative rockLength4:10 (album version)3:40 (single edit)LabelWarner MusicSongwriter(s)Paul Waaktaar-SavoyProducer(s)Martin TerefeA-ha singles chronology Shadowside (2009) Butterfly, Butterfly (The Last Hurrah) (2010) Under the Makeup (2015) Butterfly, Butterfly (...

Village in Estonia Village in Rapla County, EstoniaSoonisteVillageCountry EstoniaCountyRapla CountyParishMärjamaa ParishTime zoneUTC+2 (EET) • Summer (DST)UTC+3 (EEST) Sooniste (German: Soinitz) is a village in Märjamaa Parish, Rapla County in western Estonia.[1] References ^ Classification of Estonian administrative units and settlements 2014[dead link] (retrieved 28 July 2021) vteSettlements in Märjamaa ParishBorough Märjamaa Villages Alaküla Altküla A...

 

المسبار المداري الشمسي المسبار المداري الشمسيصورة المشغل وكالة الفضاء الأوروبية،  وناسا  الموقع الإلكتروني الموقع الرسمي  المصنع إيرباص للدفاع والفضاء  الطاقم ؟؟؟ تاريخ الإطلاق 10 فبراير 2020[1]  نقطة الحضيض 0.29 وحدة فلكية (الشمس)[2]  نقطة الأوج 0.91 وحدة ...

 

Hypothetical stage in the early evolutionary history of life on Earth For the general discussion about the origin of life, see abiogenesis. A comparison of RNA (left) with DNA (right), showing the helices and nucleobases each employs The RNA world is a hypothetical stage in the evolutionary history of life on Earth, in which self-replicating RNA molecules proliferated before the evolution of DNA and proteins.[1] The term also refers to the hypothesis that posits the existence of this ...

Hindu god of victory and war Muruga redirects here. For the 2007 film, see Muruga (film). Murugan redirects here. For the people with the name, see Murugan (surname). For the given names, see Karthikeyan, Karthik, Kartik or, see Karthika (disambiguation). KartikeyaGod of Victory and WarCommander of the Gods[1]Statue of Kartikeya at Batu Caves, MalaysiaOther namesMurugan, Subrahmanya, Kumara, Skanda, Saravana, Arumugan, Devasenapati, Shanmukha, Kathirvelan, Guha, Swaminatha, Velayuda, ...

 

Questa voce sull'argomento aeroporti dell'Australia è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Aeroporto di Perthaeroporto Codice IATAPER Codice ICAOYPPH Nome commerciale(EN) Perth Airport DescrizioneTipoCivile ProprietarioPerth Airport Pty. Ltd. Stato Australia Stato federato Australia Occidentale CittàPerth Hub Alliance Airlines Cobham Network Aviation Qantas Skippers Aviation Virgin Australia Regional Base Jetstar Airways Virgin Aus...

 

丹尼斯·德米特里耶夫摄于2015年個人資料全名丹尼斯·谢尔盖耶维奇·德米特里耶夫出生 (1986-03-23) 1986年3月23日(38歲) 苏联梁赞州普龍斯克區特尔诺沃身高1.77米(5英尺10英寸)體重90公斤(200磅)車隊資料環境场地自行车 獎牌紀錄 男子自行车 代表 俄羅斯 奥林匹克运动会 2016 里约热内卢 个人竞速赛 世界場地自由車錦標賽 2017 香港 个人竞速赛 2013 明斯克 个人竞速�...

سباق يوروميتروبول 2019 تفاصيل السباقسلسلة79. سباق يوروميتروبولمنافسةطواف أوروبا للدراجات 2019 1.HC‏التاريخ5 أكتوبر 2019المسافات176٫72 كمالبلد بلجيكانقطة البدايةلا لوفييرنقطة النهايةطرنايالفرق21عدد المتسابقين في البداية147متوسط السرعة46٫539 كم/سالمنصةالفائز بيت اليجارت (سبورت ف�...

 

ركوب الأمواجمعلومات عامةأعلى هيئة منظمة الاتحاد الدولي لركوب الأمواج المنتسبون مركمج الخصائصالتصنيف رياضة مائية — رياضات الألواح — رياضات أولمبية التجهيزات المستعملة لوح الركمجة تعديل - تعديل مصدري - تعديل ويكي بيانات مُرَكْمِج يمارس حركة ال(late drop) مركمج راكباً موجة مر�...

 

Iodure de strontium Identification No CAS 10476-86-5 No ECHA 100.030.871 SMILES [Sr+2].[I-].[I-] PubChem, vue 3D InChI InChI : vue 3D InChI=1/2HI.Sr/h2*1H;/q;;+2/p-2/f2I.Sr/h2*1h;/q2*-1;m Apparence cristaux blancs hygroscopiques Propriétés chimiques Formule I2SrSrI2 Masse molaire[1] 341,43 ± 0,01 g/mol I 74,34 %, Sr 25,66 %, Propriétés physiques T° fusion 538 °C T° ébullition décomposition à 1 773 °C Solubilit�...

German Orthodox rabbi (1820–1899) This article includes a list of general references, but it lacks sufficient corresponding inline citations. Please help to improve this article by introducing more precise citations. (August 2023) (Learn how and when to remove this message) Rabbi Dr.Azriel HildesheimerPhotograph of Azriel HildesheimerTitleRabbi, Educator, Modern Orthodox LeaderPersonalBornAzriel Hildesheimer(1820-05-11)11 May 1820Halberstadt, Province of Saxony, Kingdom of PrussiaDied12 Jun...

 

この項目では、姿勢制御システムについて説明しています。姿勢制御(Attitude control)については「姿勢制御」をご覧ください。 姿勢制御システム(しせいせいぎょシステム、英: Reaction Control System, RCS)は、宇宙船のサブシステムの一種である。その目的は姿勢制御と操縦である。RCSは、任意の方向に若干の推力を与えることができる。また、機体の回転を制御する�...