Вопрос

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

Это было полезно?

Решение

Это упрощает процесс компиляции.Когда вы хотите компилировать модули независимо, вам нужно что-то для описания частей, с которыми будут связаны ссылки, без необходимости импортировать все остальные файлы целиком.

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

Наконец, это может способствовать отделению интерфейса от реализации.

Это не единственный способ решить эти проблемы, но 30 лет назад он был хорошим.Сегодня мы, вероятно, не стали бы использовать заголовочные файлы для языка, но они не были изобретены в 2009 году.

Другие советы

Архитекторы многих современных языков, таких как Java, Eiffel и C #, явно согласны с вами - эти языки извлекают метаданные о модуле из реализации.Однако сама по себе концепция заголовков не исключает этого - очевидно, что для компилятора было бы простой задачей извлечь .h файл во время компиляции .c, например, точно так же, как компиляторы для этих других языков делают неявно.Тот факт, что типичные современные компиляторы C этого не делают, не является проблемой языкового дизайна - это проблема реализации;очевидно, что у пользователей нет спроса на такую функцию, поэтому ни один поставщик компилятора не утруждает себя ее реализацией.

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

Если C, C ++ и c продолжат процветать (очевидно, у них и сегодня все в порядке;-), и спрос, подобный вашему, на отказ от ручного написания заголовков будет расти, в конечном итоге разработчикам компиляторов придется предоставить опцию "генерация заголовков", и "лучшее из обоих миров" не останется теоретическим!-)

Это помогает немного подумать о возможностях компьютеров, которые были доступны, когда, скажем, был написан c .Основная память измерялась в киловордах, и не обязательно их было очень много.Диски были больше, но ненамного.Serrious storage означал катушечные кассеты, смонтированные вручную сварливыми операторами, которые действительно хотели, чтобы вы ушли, чтобы они могли поиграть в hunt the wumpus.Машина 1 MIPS была кричащий быстро.И со всеми этими ограничениями вы должны были Поделиться IT.Возможно, с десятком других пользователей.

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

Не забывайте о документации, предоставляемой заголовком.Обычно в нем есть все, что вам нужно знать для использования модуля.Я, со своей стороны, не хочу просматривать длинный исходный код, чтобы узнать, что мне нужно использовать и как это вызвать...Вы бы все равно извлекли эту информацию, что фактически приводит к получению файла -- a header.Конечно, с современными IDE это больше не проблема, но, работая с некоторым старым кодом на C, я действительно люблю иметь созданные вручную заголовочные файлы, которые включают комментарии об использовании и о предварительных и последующих условиях.

Синхронизировать исходный код, заголовок и дополнительную документацию по-прежнему является еще одной уловкой червей...

Когда C изобрели, всю идею проверки двоичных выходных файлов языковых процессоров было бы трудно понять .h Файлы.Существовала система под названием ВЕСЕЛЫЙ это делало что-то похожее, но это было экзотично и ограничивалось более или менее исключительно военными проектами.(Я никогда не видел ВЕСЕЛОЙ программы, я только слышал о ней.)

Итак, когда вышел C, обычным шаблоном проектирования для модульности было "никаких проверок вообще".Могло существовать ограничение, согласно которому символы .text могли ссылаться только на .text, а .data - на .data, но это было все.То есть компиляторы того времени обычно обрабатывали по одному исходному файлу за раз, а затем компоновщики объединяли их без малейшего уровня проверки ошибок, за исключением, если вам повезет, "Я - символ функции" или "Я - символ данных".

Таким образом, идея о том, чтобы компилятор действительно понимал то, что вы вызывали, была несколько новой.

Даже сегодня, если вы создадите абсолютно фальшивый заголовок, никто не поймает вас в большинстве Компиляторы AOT.Умные вещи, такие как языки CLR и Java, на самом деле кодируют вещи в файлах классов.

Так что да, в долгосрочной перспективе у нас, вероятно, не будет заголовочных файлов.

Нет, у вас нет заголовков в Java - но у вас есть интерфейсы, и я, каждый серьезный Java-гуру, рекомендую вам определять все, что используется другими проектами / системами, как интерфейс и реализацию.

Давайте посмотрим, что определение интерфейса Java содержит сигнатуры вызовов, определения типов и содержимое.

БОЛЬШИНСТВО заголовочных файлов C содержат подписи вызовов, определения типов и константы.

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

int function target () {
    // Default for shoot
    return FOOT;
}

Подробнее читайте это

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

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

А что, если вы хотите предоставить кому-то другому объявления для использования вашей библиотеки, не предоставляя им реализацию?

Как указывает другой ответ - первоначальной причиной появления заголовков было упрощение синтаксического анализа / компиляции на платформах с очень простыми и ограниченными инструментами.Это был большой шаг вперед - иметь машину с двумя дискетами, чтобы вы могли разместить компилятор на одной, а свой код на другой - это намного упростило задачу.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top