2013-08-26 2 views
2

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

И еще один вопрос:

Давайте предположим, что у меня есть 3 файла: header.h, main.c и other.c.
У меня есть функция с именем func(), которая определяется и используется только в файле other.c. Должен ли я помещать прототип функции в файл заголовка или в файл other.c?

ответ

7
  1. Несколько заголовков против одного заголовка.

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

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

    Все функции в модуле, который может быть static, должны быть static.

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

  2. Функция func() используется только в other.c поэтому функция должна быть static так, что она видна только в other.c. Он не должен входить в заголовок, если какой-либо другой файл не использует эту функцию - и в этот момент крайне важно, чтобы он попал в заголовок.

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

1

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

Если функция в other.c является локальной, нет необходимости включать ее в файл заголовка.

2

Если это БОЛЬШОЙ проект, вы почти наверняка должны иметь несколько заголовочных файлов, чтобы сделать что-нибудь разумное из вашего проекта.

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

В заголовочном файле должна содержаться одна «функциональность». Итак, если у вас есть программа, касающаяся счетов клиентов, акций, счетов и т. Д., У вас может быть один «customer.h», «stock.h» и «invoice.h». Вероятно, у вас также будет «dateutils.h» для расчета «когда этот счет-фактура должен быть оплачен и сколько времени прошло с момента отправки счета-фактуры для отправки напоминаний.

В целом, 0:

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

static void func(int x) 
{ 
    return x * 2; 
} 

Если по какой-то причине, вы должны направить объявить func (потому что некоторая функция перед func должна вызвать func), а затем объявить ее в начале исходного файла. Нет необходимости «распространять его», добавив его в файл заголовка.

Отметив это static, вы ясно даете понять, что «никто, кроме этого файла, не использует эту функцию». Если на более позднем этапе вы обнаружите, что «Hmm, этот func действительно полезен и в модуле B», затем добавьте его в подходящий файл заголовка (или создайте новый файл заголовка) и удалите static. Теперь любой, кто читает исходный файл, знает, что им нужно будет проверить вне этого исходного файла, чтобы все изменения в func были в порядке в остальной части кода.

Смежные вопросы