Назначение охранников заголовка - PullRequest
10 голосов
/ 05 июня 2010

В C ++, какова цель защиты заголовка в программе C ++.

Из сети я обнаружил, что для предотвращения включения файлов снова и снова, но как защита заголовка гарантирует это.

Ответы [ 2 ]

21 голосов
/ 05 июня 2010

Защитный заголовок (или более условно "включить защиту") предназначен для предотвращения проблем, если заголовочный файл включен более одного раза; например,

#ifndef MARKER
#define MARKER
// declarations 
#endif

В первый раз, когда этот файл #include -едан, символ препроцессора MARKER будет неопределенным, поэтому препроцессор определит символ, и следующие декларации будут включены в исходный код, видимый компилятором. В последующих #include будет определен символ MARKER, и, следовательно, все в #ifnde / #endif будет удалено препроцессором.

Чтобы это работало правильно, символ MARKER должен отличаться для каждого заголовочного файла, который может быть #include -ед.

Причина, по которой это необходимо, заключается в том, что в C / C ++ запрещено определять тип или функцию с одним и тем же именем более одного раза в модуле компиляции. Guard позволяет файлу заголовка #include другим файлам заголовка, не беспокоясь о том, что это может привести к тому, что некоторые объявления будут включены несколько раз.


Короче говоря, это не не мешает вам #include -ить файл снова и снова. Скорее всего, позволяет сделать это , не вызывая ошибок компиляции .

2 голосов
/ 05 июня 2010

Цель защиты заголовков - предотвратить проблемы, при которых некоторый код может появляться только один раз на единицу перевода.

Одним из примеров является структура. Вы не можете переопределить структуру, даже если второе определение идентично. Итак, если вы попытаетесь скомпилировать следующее:

struct foo { int x; };
struct foo { int x; };

Компилятор потерпит неудачу из-за переопределения.

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

...