C Header include-guards используется только в заголовочных файлах, но не в них.c файлы. Почему?


Я уже некоторое время использую guards в заголовочных файлах, и единственная причина, по которой я понимаю, почему они используются, - это возможность однократного включения этого ( заголовочного файла, имеющего рассматриваемые guards ) при компиляции.

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

Анс. собранный из ответов ниже.

Вообще все определения уходят вглубь .файл c и заголовочные файлы (.H файлы) включают все объявления. Это не очень хорошая практика, чтобы включать .c файлы.

Для того, чтобы связать только с одним включением заявлений, предоставленных в распоряжение .C-файл при компиляции, специфичный для единицы перевода (поэтому, если есть две или более библиотек, которые должны быть связаны; т. е. у нас есть две или более единиц перевода); защита заголовка помогает включить только файл заголовка ОДНАЖДЫ.

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

2 4

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.