У чым розніца паміж загалоўкамі і зыходнымі файламі ў C ++?


адказ 1:

Людзі выкарыстоўваюць загалоўныя файлы для арганізацыі файлаў у пакеце. Вы можаце лёгка ўбачыць, што пакет мае, прачытаўшы файлы загалоўкаў, у якіх дэкларацыі выразна размешчаны (і наогул каментуюцца). Вы можаце азнаёміцца ​​з тым, як гэта працуе, не пракручваючы радкі кода.

Фактычны код звычайна вызначаецца ў зыходных файлах.

Гэта агульны прыклад C, таму ён не адпавядае сінтаксісу C ++ (я іржавы):

/ * foo.h * / void func1 (int, int);

(Асобны файл)

/ * foo.c * / #include "foo.h" int main () {func1 (3,3); } void func1 (int x, int y) {return x + 2 * y * y; }

Ці бачыце вы, як вы маглі выкарыстоўваць функцыю func1 ў галоўным меню foo.c, не пераасэнсоўваючы? Іншая справа ў файлах загалоўкаў заключаецца ў тым, што вы можаце паставіць меншыя функцыі пад усе (бо галоўнае - гэта самае важнае).

У C ++ у нас значна больш функцый: класы, прасторы імёнаў і г.д., усё роўна не перашкодзіць правільнай арганізацыі файлаў. Напрыклад, мы можам зрабіць аб'явы класа ў загалоўку, а затым вызначыць функцыі класа ў зыходным кодзе.


адказ 2:

Адказ просты: файлы загалоўкаў апісваюць інтэрфейс; Яны не ўтрымліваюць алгарытму рэалізацыі. Менавіта для гэтага патрэбны зыходныя файлы.

Але гэта толькі вельмі павярхоўнае тлумачэнне. Вы можаце рэальна рэалізаваць функцыі ў загалоўках. Я зразумею, але па-першае, у чым практычная розніца паміж "загалоўкам" і "зыходным файлам"?

Адказ такі: няма розніцы, акрамя звычайнай. Вы можаце выкарыстоўваць дырэктыву папярэдняга працэсара #include, каб уставіць любы файл, дзе ён знаходзіцца. Аднак, за выключэннем вельмі асаблівых выпадкаў, вы не жадаеце ўключаць свой агульны код (зыходныя файлы). Звычайна для ўключэння інфармацыі і спецыфікацыі інтэрфейсу (функцыі дэкларацыі) неабходна выкарыстоўваць іх.

На самай справе, усталяванне кода будзе азначаць, што ён будзе памнажацца ва ўсіх файлах, дзе запушчаны #include. І гэта, хутчэй за ўсё, выклікае непажаданыя паводзіны.

Зараз вернемся да рэалізацыі функцыі ў файлах «загаловак». Вы вызначаеце код у іх:

  • Макрасы Макрас пашыраецца замест яго выкарыстання. Гэта робіцца за кошт папярэдняга працэсара і зноў шляхам непасрэднага перапісання выкарыстання вызначэння макраса з дапамогай яго (па жаданні параметрызаванага) вызначэння. Вы не называеце макрас. Яго выкарыстанне перапісваецца перад складаннем. Убудаваныя функцыі. Яны маглі (і не маглі) працаваць аналагічна макрасам. За выключэннем таго, што кампілятар можа выбраць рэальную функцыю (і згенераваць яе выклік), а не ўтрымліваць змест функцыі. Агульная функцыя генеруецца для кожнага #include (калі гэта няяўна лічыцца ўбудаваным, гл ніжэй). Убудаваны дэкларатар не з'яўляецца абавязковым для кампілятара. ён можа быць убудаваным, але не можа быць, гэта проста "намёк". На самай справе, стандарт C ++ 17 мяняе семантыку з убудаванай у "дазволенае некалькі азначэнняў". Таму будзьце ўважлівыя; Напрыклад, калі вы ствараеце ўбудаваную функцыю са статычнымі дадзенымі, якія яна змяшчае, вы можаце лёгка мець некалькі асобнікаў статычных дадзеных (кожны для вызначэння функцыі). Напэўна, не тое, што хацелася ... код шаблону. Шаблоны прадстаўлены асобнікамі. Калі вы выкарыстоўваеце шаблон для стварэння канкрэтнага тыпу, кампілятар стварае гэты тып лакальна (як калі б вы «ўручную» вызначылі яго, калі ён выкарыстоўваўся). Функцыі шаблону няяўна лічацца ўбудаванымі функцыямі (але кампілятар можа і часта вырашае не ставіць іх у радок для згенераванага тыпу).

Увогуле вы вызначаеце свае (агульнадаступныя) тыпы і дэкларуеце свае функцыі ў файлах загалоўкаў. Тут вы таксама вызначыце свае макрасы, шаблоны і ўбудаваныя функцыі. Вы вызначаеце свае функцыі ў зыходных файлах, а таксама аб'яўляеце / вызначаеце мясцовыя, непублічныя, тыпы і статычныя функцыі. Загалоўкі - гэта ключы для доступу да функцый, крыніцы рэалізуюць функцыі.

Зыходныя файлы кампілююцца ў аб'ектныя файлы. Гэта ўключае ў сябе ўвесь код, які быў згенераваны з крыніцы, і які таксама ўключае ўвесь код, які вызначаны ў файлах загалоўкаў, якія ўтрымліваюцца ў зыходным файле. Нарэшце, ваша праграма (альбо бібліятэка) складаецца з гэтых звязаных файлаў аб'ектаў.

Спадзяюся, што гэта дапамагае.


адказ 3:

Зыходныя файлы - гэта файлы, якія ўтрымліваюць код, які кампілюецца. Рэалізацыя вашага алгарытму змяшчаецца ў зыходным файле.

Файлы загалоўкаў утрымліваюць код (звычайна вызначэнні функцый або класаў), які скапіруецца ў зыходны файл з дапамогай дырэктывы прэпрацэсара #include. Вялікім плюсам выкарыстання файлаў загалоўкаў з'яўляецца іх паўторнае выкарыстанне. Я маю на ўвазе, уявіце, вам прыйдзецца пісаць код для вызначэння класа радка кожны раз, калі вы хацелі выкарыстоўваць яго пры простым #include Было б дастаткова.


адказ 4:

Вы ўстаўляеце змесціва ў файл загалоўка, які выкарыстоўваецца ДРУГІмі зыходнымі файламі.

Каб быць педантычным, файлы загалоўкаў з'яўляюцца канвенцыяй на C і C ++. Некаторыя кампілятары могуць нават не хвалюе, ці варта кампіляваць файл з пашырэннем .h.

C абраў прымітыўны, але дастаткова магутны і гнуткі спосаб рэалізацыі препроцессора. Ён апрацоўвае #include і гэтак далей. Кампілятар бачыць файл толькі пасля таго, як усе ўключаныя ... Загаловак ніколі не складаецца па з'ездзе. Ён уключаны толькі (звярніце ўвагу, што ў адпаведнасці з Канвенцыяй ёсць выключэнні). Такім чынам, вы ўстаўляеце толькі дадзеныя ў загалоўкі, якія дазваляюць зыходнаму файлу ведаць, якая інфармацыя даступная з іншых зыходных файлаў, напрыклад. Б. Асаблівасці. Ці для звычайных тыпаў. Ці зручныя макрасы. Ці ... ну ... мноства ўжыванняў.