Какова точка файлов заголовков в C?

Возможные дубликаты:
[C] Заголовок для исходного файла.
В С++ для чего нужны файлы заголовков и файлы cpp?
С++ - Что должно зайти в файл .h?

Является ли единственная причина, по которой файлы заголовков существуют на C, поэтому разработчик может быстро увидеть, какие функции доступны, и какие аргументы они могут принять? Или это как-то связано с компилятором?

Почему другой метод не используется? Это только я, или кажется, что наличие двух наборов определений функций приведет к большему количеству обслуживания и большему количеству ошибок? Или знает о файлах заголовков только то, что должен знать каждый разработчик C?

Ответы

Ответ 1

Заголовочные файлы необходимы для объявления доступных функций и переменных. Возможно, вы вообще не имеете доступа к определениям (=.c files); C поддерживает только двоичное распределение кода в библиотеках.

Ответ 2

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

Все языки нуждаются в такой информации, хотя они извлекают информацию по-разному. Например, компилятор Java делает это, просматривая либо файл класса, либо исходный код java для извлечения информации.

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

Ответ 3

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

Скажите, что у вас есть функция float *f(int a, int b), определенная в файле a.c и повторно используемая в b.c и d.c. Чтобы позволить компилятору правильно проверять аргументы и возвращать значения, вы помещаете прототип функции в файл заголовка и включаете его в исходные файлы .c или повторяете прототип в каждом исходном файле.

То же самое касается typedef и т.д.

Хотя теоретически можно повторить одно и то же объявление в каждом исходном файле, это станет настоящим кошмаром для правильного управления им.

В некотором языке используется тот же подход. Я помню, что единицы TurboPascal не очень разные. Сначала вы ставили бы use ..., чтобы сообщить, что вам потребуются функции, которые были определены в другом месте. Я не могу вспомнить, было ли это передано в Delphi.

Ответ 4

  • Знайте, что находится в библиотеке в вашем распоряжении.
  • Разделите программу на куски размером с укусом для компилятора. Компиляция мегабайта файлов C одновременно потребует больше ресурсов, чем может предложить большинство современных аппаратных средств.
  • Уменьшить нагрузку на компилятор. Почему он должен знать в процедурах отображения экрана о глубоком движке базы данных? Пусть он изучит только те функции, которые ему нужны сейчас.
  • Отдельные частные и общедоступные данные. Это использование не часто, но вы можете реализовать в C то, что С++ использует частные поля для: каждый .c файл содержит два файла .h, один с объявлениями частных вещей, а другой - с любыми другими, которые могут потребоваться из файла. Меньше шансов на конфликт пространства имен, более безопасный из-за герметизации.
  • Альтернативные конфиги. Makefile решает, какой заголовок использовать, и тот же код может обслуживать две разные платформы, учитывая два разных файла заголовка.

возможно больше.