C Header include-guards используется только в заголовочных файлах, но не в них.c файлы. Почему?
Я уже некоторое время использую guards в заголовочных файлах, и единственная причина, по которой я понимаю, почему они используются, - это возможность однократного включения этого ( заголовочного файла, имеющего рассматриваемые guards ) при компиляции.
Я хочу знать, есть ли какие-либо другие причины использования защитников заголовка и почему они не используются в .файлы c и что происходит, если охранники используются для .с файлами тоже ?
Анс. собранный из ответов ниже.
Вообще все определения уходят вглубь .файл c и заголовочные файлы (.H файлы) включают все объявления. Это не очень хорошая практика, чтобы включать .c файлы.
Для того, чтобы связать только с одним включением заявлений, предоставленных в распоряжение .C-файл при компиляции, специфичный для единицы перевода (поэтому, если есть две или более библиотек, которые должны быть связаны; т. е. у нас есть две или более единиц перевода); защита заголовка помогает включить только файл заголовка ОДНАЖДЫ.
Это происходит из-за стадии препроцессора еще до того, как файлы компилируются для получения объекта (.о расширение файла). Этап препроцессора заменяет все макросы и включает в себя соответствующие данные, что позволяет включить ваш .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
К example_1.h вы говорите, что компилируете систему, когда вы encouter #include example_1.h самый первый время, определите макрос (этот макрос является локальным для вашей системы сборки), который указывает мне, что я уже включил example_1.h. в следующий раз, когда я encouter
#include example_1.h
я увижу, чтоEXAMPLE_1
действительно определен в системе сборки и перескочить.Это кажется тривиальной вещью для небольшого примера, но в больших проектах с сотнями файлов это действительно очень полезная функция.А поскольку
.c files
не включается другими файлами, то нет смысла включать их в.c files
.