Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

C++ Разница между заголовочным и файлом реализации?

#cpp


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


Ответы

Ответ 1



В С / C++ текст программы разделяется на множество клочков, каждый из которых хранится в отдельном текстовом файле. На первом этапе сборки препроцессор начинает читать это отдельные файлы заменяя директивы #include на содержимое соответствующих текстовых файлов и получая на выходе длинный текстовый документ единицы трансляции, который затем передается компилятору. Те текстовые файлы, которые включаются в другие текстовые файлы при помощи директивы #include обычно называют заголовочными файлами и используют для них расширения .h .hpp .hxx .inl и подобные (многие заголовочные файлы из стандарной библиотеки вообще не имеют расширения). А те текстовые файлы, с которых начинается построение единицы трансляции (соответственно эти файлы обычно передаются среди аргументов командной строки компилятору) обычно имеют расширение .c .cpp .cc или .cxx. Заголовочные файлы с расширением .inl обычно отличаются от других заголовочных файлов тем, что они не содержат include guard и их содержимое может многократно встречаться в тексте единицы трансляции.

Ответ 2



Как тут уже правильно сказали, разница в этих файлах весьма условная. Исторически в языке Си в .h файлах хранились декларации, а в .c файлах хранились реализации. Декларации это то, что используется в более чем одном месте программы. Исторически в языке Си это были дефайны, прототипы функций, описания структур, декларации typedef. Реализации это то, что должно быть только в одном месте программы. Исторически в языке Си это были реализации функций и статические данные. В языке С++ это деление сохранилось с учетом того, что в .h файлах теперь содержатся описания классов, шаблонов, констант и опять же всего того, что используется в более чем одном месте программы. Также с появлением шаблонов в языке С++ наметилась тенденция (особенно в построении библиотек шаблонов), что вся программа содержится в .h файлах. UPD1: Так как в .h файлах хранятся декларации (то есть информация, которая должна использоваться в разных единицах трансляции), то предусмотрен механизм #include. С помощью механизма #include можно (и нужно) включать файлы с декларациями в разные единицы трансляции, там, где нужна информация о пользовательских структурах данных, прототипах функций и типах (а в С++ еще и о шаблонах, константах и прочих нововведениях). Вообще весь язык Си был сделан Ричи и Томсоном "для себя", как инструмент при написании первых версий Юникса. Поэтому этот язык содержит так много элементов, которые поддерживают разработку программ при помощи транслятора с языка высокого уровня. Разделение программы на .h и .c/.cpp файлы как раз и относится к такой поддержке и это разделение вытекает из логики деления проекта на разные единицы трансляции то есть на разные файлы.

Комментариев нет:

Отправить комментарий