Заголовок на исходный файл

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

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

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

11
задан Ori Popowski 22 July 2009 в 20:02
поделиться

7 ответов

Заголовочные файлы в C отделяют объявления (которые должны быть доступны для каждого файла .c, использующего функции) от определений (которые должны быть в одном месте). Кроме того, они обеспечивают небольшую модульность, поскольку в файл заголовка можно поместить только общедоступный интерфейс, не упоминая функции и статические переменные, которые должны быть внутренними для файла .c. Это использует файловую систему для предоставления публичного интерфейса и частной реализации.

Практика соединения одного файла .h с одним файлом .c в основном удобна. Таким образом, вы знаете, что объявления находятся в файле .h, а определения - в соответствующем файле .c.

7
ответ дан 3 December 2019 в 03:36
поделиться

Логическая, структурированная организация и небольшие исходные файлы позволяют:

  • быстрее и лучше программировать - разбивать код на более управляемые и понятные chunks упрощает поиск, понимание и редактирование соответствующего кода.
  • повторное использование кода - различные «модули» кода могут быть разделены на группы файлов исходного кода / заголовка, которые вы можете более легко интегрировать в разные программы .
  • лучшая «инкапсуляция» - только файлы .c, которые специально включают этот заголовок, могут использовать его функции, что помогает вам минимизировать отношения между различными частями вашего кода, что способствует модульности. Это не мешает вам использовать что-либо из любого места, но помогает задуматься о том, почему конкретному файлу c нужен доступ к функциям, объявленным в определенном заголовке.
  • Помогает совместной работе - два программиста пытаются изменить один и тот же код файл одновременно обычно вызывает проблемы (например, эксклюзивные блокировки) или дополнительную работу (например, слияние кода), которые замедляют друг друга.
  • более быстрая компиляция - если у вас есть один заголовок, то каждый раз, когда вы вносите в него изменения, вы должны перекомпилировать все. При большом количестве небольших заголовков необходимо перестраивать только файлы .c, которые # включают измененный заголовок.
  • упрощение сопровождения и рефакторинга - по всем вышеперечисленным причинам

В частности, «один заголовок для каждого исходного файла» позволяет очень легко найти объявления, относящиеся к c-файлу, с которым вы работаете. Как только когда вы начинаете объединять несколько заголовков в один файл, становится сложно связать файлы c и h, что в конечном итоге значительно усложняет создание большого приложения. Если вы работаете только над небольшим приложением, все же неплохо выработать привычку использовать масштабируемый подход.

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

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

7
ответ дан 3 December 2019 в 03:36
поделиться

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

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

Например, если .c имеет функции foo () и fooHelper (), но никто, кроме foo (), не должен вызывать fooHelper ( ) напрямую, затем помещая foo () и fooHelper () в foo.c, помещая только объявление foo () в foo.h и объявляя fooHelper () как static, это помогает обеспечить выполнение других частей вашей программы. доступ только к foo () и не должен знать или заботиться о fooHelper (). Это своего рода не объектно-ориентированная форма инкапсуляции.

Наконец, движки make обычно достаточно умны, чтобы перестраивать только те файлы, которые были изменены с момента последней сборки, поэтому их можно разбить на несколько файлов .c (используя файлы .h, чтобы поделиться тем, что необходимо поделиться) помогает ускорить сборку.

ему не нужен заголовок.

Например, если .c имеет функции foo () и fooHelper (), но никто, кроме foo (), не должен вызывать fooHelper () напрямую, а затем помещая foo () и fooHelper () в foo.c, помещая только объявление foo () в foo.h и объявляя fooHelper () как static, это помогает обеспечить, чтобы другие части вашей программы имели доступ только к foo () и не должны знать или заботиться о fooHelper ( ). Это своего рода не объектно-ориентированная форма инкапсуляции.

Наконец, движки make обычно достаточно умны, чтобы перестраивать только те файлы, которые были изменены с момента последней сборки, поэтому их можно разбить на несколько файлов .c (используя файлы .h, чтобы поделиться тем, что необходимо поделиться) помогает ускорить сборку.

ему не нужен заголовок.

Например, если .c имеет функции foo () и fooHelper (), но никто, кроме foo (), не должен вызывать fooHelper () напрямую, а затем помещая foo () и fooHelper () в foo.c, помещая только объявление foo () в foo.h и объявляя fooHelper () как static, это помогает обеспечить, чтобы другие части вашей программы имели доступ только к foo () и не должны знать или заботиться о fooHelper ( ). Это своего рода не объектно-ориентированная форма инкапсуляции.

Наконец, движки make обычно достаточно умны, чтобы перестраивать только те файлы, которые были изменены с момента последней сборки, поэтому их можно разбить на несколько файлов .c (используя файлы .h, чтобы поделиться тем, что необходимо поделиться) помогает ускорить сборку.

затем, помещая foo () и fooHelper () в foo.c, помещая только объявление foo () в foo.h и объявляя fooHelper () как static, это помогает обеспечить, чтобы другие части вашей программы имели доступ только к foo () и не должны знать или заботиться о fooHelper (). Это своего рода не объектно-ориентированная форма инкапсуляции.

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

затем, помещая foo () и fooHelper () в foo.c, помещая только объявление foo () в foo.h и объявляя fooHelper () как static, это помогает обеспечить, чтобы другие части вашей программы имели доступ только к foo () и не должны знать или заботиться о fooHelper (). Это своего рода не объектно-ориентированная форма инкапсуляции.

Наконец, движки make обычно достаточно умны, чтобы перестраивать только те файлы, которые были изменены с момента последней сборки, поэтому их можно разбить на несколько файлов .c (используя файлы .h, чтобы поделиться тем, что необходимо поделиться) помогает ускорить сборку.

4
ответ дан 3 December 2019 в 03:36
поделиться

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

(Клиентский код - это код, который #include является .h файл, чтобы использовать экспортированные функции, но не реализует ни одну из функций в .h.)

4
ответ дан 3 December 2019 в 03:36
поделиться

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

4
ответ дан 3 December 2019 в 03:36
поделиться

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

1
ответ дан 3 December 2019 в 03:36
поделиться

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

Таким образом вы не загрязняете ненужными объявлениями . (в большом программном проекте может быть проблемой)

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

0
ответ дан 3 December 2019 в 03:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: