Можно сделать целую статическую вещь инициализатора, как детализировано выше, но это может быть настоящий лентяй, когда размер массива изменяется (когда массив embiggens, если Вы не добавляете соответствующие дополнительные инициализаторы, Вы получаете мусор).
memset дает Вам хит во время выполнения для того, чтобы сделать работу, но никакой сделанный правильно хит размера кода не неуязвим для выстраивания изменений размера. Я использовал бы это решение почти во всех случаях, когда массив был больше, чем, скажем, несколько дюжин элементов.
, Если было действительно важно, чтобы массив был статически объявлен, я запишу программу, чтобы записать программу для меня и сделать его частью процесса сборки.
Заголовочные файлы в C отделяют объявления (которые должны быть доступны для каждого файла .c, использующего функции) от определений (которые должны быть в одном месте). Кроме того, они обеспечивают небольшую модульность, поскольку в файл заголовка можно поместить только общедоступный интерфейс, не упоминая функции и статические переменные, которые должны быть внутренними для файла .c. Это использует файловую систему для предоставления публичного интерфейса и частной реализации.
Практика соединения одного файла .h с одним файлом .c в основном удобна. Таким образом, вы знаете, что объявления находятся в файле .h, а определения - в соответствующем файле .c.
Логическая, структурированная организация и небольшие исходные файлы позволяют:
В частности, «один заголовок для каждого исходного файла» позволяет очень легко найти объявления, относящиеся к c-файлу, с которым вы работаете. Как только когда вы начинаете объединять несколько заголовков в один файл, становится сложно связать файлы c и h, что в конечном итоге значительно усложняет создание большого приложения. Если вы работаете только над небольшим приложением, все же неплохо выработать привычку использовать масштабируемый подход.
становится трудно связать файлы c и h, что в конечном итоге значительно затрудняет создание большого приложения. Если вы работаете только над небольшим приложением, все же неплохо выработать привычку использовать масштабируемый подход. становится трудно связать файлы c и h, что в конечном итоге значительно затрудняет создание большого приложения. Если вы работаете только над небольшим приложением, все же неплохо выработать привычку использовать масштабируемый подход.Потому что, как вы сами сказали, невозможно разместить «все программное обеспечение» в один исходный файл.
Если ваша программа очень маленькая, то да, проще просто поместить все в один файл .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, чтобы поделиться тем, что необходимо поделиться) помогает ускорить сборку.
Программисты используют этот метод, потому что он позволяет им отделить интерфейс от реализации , в то время как гарантирует, что клиентский код и реализация согласуются с объявлениями функций . Файл .h - это «единственная точка истины» (см. «Не повторяйтесь») о прототипе каждой функции.
(Клиентский код - это код, который #include
является .h файл, чтобы использовать экспортированные функции, но не реализует ни одну из функций в .h.)
Вы помещаете в заголовочный файл только тот минимум, который другие исходные файлы должны «видеть» для компиляции. Я видел некоторых людей, которые помещали все, что не является кодом, в файл заголовка (все определения типов, все определения #, все структуры и т. Д.), Даже если ничто другое в кодовой базе не будет их использовать. Из-за этого заголовочный файл намного труднее читать вам и тем, кто хочет использовать ваш модуль.
Вам не нужен один заголовок для каждого исходного файла. Один заголовок на модуль, содержащий общедоступный интерфейс, и, возможно, дополнительный заголовок, содержащий частные объявления и т. Д., Общие для файлов в этом модуле.
Обычно заголовок для метода исходного файла означает, что вы объявляете в этом заголовке только функции из этого модуля компиляции.
Таким образом вы не загрязняете ненужными объявлениями . (в большом программном проекте может быть проблемой)
Что касается отдельных единиц компиляции, они ускоряют компиляцию и могут помочь вам избежать конфликтов, если частные символы объявлены статическими.