C-заголовочные заголовки используются только в заголовочных файлах, но не в.c файлах. Зачем?
Я уже некоторое время использую элементы защиты в заголовочных файлах, и единственная причина, по которой я понимаю, почему они используются, - включить одноразовое включение этого (заголовочный файл с рассматриваемыми элементами защиты) во время компиляции.
Я хочу знать, есть ли какие-либо другие причины использования средств защиты заголовков, и почему они не используются в файлах.c, и что происходит, если средства защиты также используются для файлов.c?
Отв. собраны из ответов ниже.
Обычно все определения помещаются в файл.c, а файлы заголовков (файлы.h) включают все объявления. Не рекомендуется включать файлы.c.
Чтобы связать только одно включение объявлений, сделанных доступными для файла.c при компиляции, специфичных для модуля перевода (поэтому, если есть две или более библиотек, которые должны быть связаны, то есть у нас есть две или более переводческие единицы); Охранники заголовка помогают в том числе заголовочный файл ТОЛЬКО ОДИН РАЗ.
Это происходит из-за стадии препроцессора еще до того, как файлы скомпилированы для получения файла объекта (с расширением.o). Этап препроцессора заменяет все макросы и включает в себя соответствующие данные, что позволяет включать ваш файл.h ТОЛЬКО один раз.
2 ответа
То, что делают охранники заголовков, это не предотвращение многократного включения в проект, а только в одну единицу перевода.
Например, допустим, у вас есть два заголовочных файла, a.h
а также b.h
, Заголовочный файл b.h
включает в себя a.h
и тогда оба a.h
а также b.h
включен в исходный файл s.c
, Без заголовка охраняет файл a.h
будет включен дважды, что может привести к ошибкам. Если заголовочные файлы имеют защитные колпачки, то файл a.h
будет включен только один раз.
Вам не нужны средства защиты заголовков в исходных файлах, потому что обычно вы не включаете их в другие файлы.
Как вы упомянули, основная цель заголовка защищает от повторного включения.
Рассмотрим следующий пример
у вас есть следующие заголовочные файлы в вашем модуле компиляции
example_1.h
example_2.h (includes example_1.h)
В файле 'C' вы включаете 'example_1.h'
а также 'example_2.h'
утверждение (макрос)
'#include example_1.h'
будет казнен дважды.
Когда вы добавляете строку
#ifdef EXAMPLE_1
#define EXAMPLE_1
#endif
to example_1.h вы говорите своей системе компиляции, когда вы впервые запускаете #include example_1.h, определите макрос (этот макрос является локальным для вашей системы сборки), который указывает мне, что я уже включил example_1.h.The в следующий раз я приветствую #include example_1.h
Я увижу что EXAMPLE_1
действительно определен в системе сборки и пропущен.
Для небольшого примера это кажется тривиальной вещью, но в больших проектах с сотнями файлов это действительно очень полезная функция. .c files
не включайте другие файлы, не имеет смысла включать их в .c files
,