Include guard

Include guard
Правильный заголовок этой статьи — #include guard. Он показан некорректно из-за технических ограничений.

В языках программирования Си и C++ директивы #include guards (защита подключения) иногда называется macro guard (макрозащита) — это особая конструкция, применяемая для избежания проблем с «двойным подключением» при использовании директивы компилятора #include. Добавление #include guards в заголовочный файл является одним из способов сделать этот файл идемпотентным.

Содержание

Двойное подключение

Следующий фрагмент кода на языке Си демонстрирует потенциальные проблемы, которые могут возникнуть, если пропустить #include guards:

Файл grandfather.h
 struct foo {
     int member;
 };
Файл father.h
 #include "grandfather.h"
Файл child.c
 #include "grandfather.h"
 #include "father.h"

Здесь к файлу «child.c» напрямую подключаются две копии заголовочного файла «grandfather.h». Это может вызвать ошибку компиляции, так как структура типа foo явным образом определяется дважды.

Применение #include guards

Файл grandfather.h
 #ifndef H_GRANDFATHER
 #define H_GRANDFATHER
 
 struct foo {
     int member;
 };
 #endif
Файл father.h
 #include "grandfather.h"
Файл child.c
 #include "grandfather.h"
 #include "father.h"

В данном примере первое включение файла «grandfather.h» вызывает макроопределение H_GRANDFATHER. Далее, когда к «child.c» подключается «grandfather.h» второй раз, проверка #ifndef выдаёт ошибку, и препроцессор пропускает #endif, таким образом избегая второго определения struct foo. В результате программа компилируется корректно.

Проблемы использования

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

По этой причине, во многих случаях (в языках Си и C++) используется нестандартная директива #pragma once. Эта директива, указанная в начале заголовочного файла, будет указывать, что файл должен подключаться только один раз. Этот подход, однако, может плохо сказаться в виде потенциальной сложности определения ситуации, когда две директивы #include, указанные в разных местах, на самом деле ссылаются на один заголовок (например, при помощи символьной ссылки в Unix-подобных системах). Более того, так как #pragma once не является стандартной директивой, её семантика может серьёзно изменяться в зависимости от применения.

См. также

Дополнительные источники


Wikimedia Foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Полезное


Смотреть что такое "Include guard" в других словарях:

  • Include guard — In the C and C++ programming languages, an #include guard, sometimes called a macro guard, is a particular construct used to avoid the problem of double inclusion when dealing with the #include directive. The addition of #include guards to a… …   Wikipedia

  • Include Guard — Der Include Guard (dt: Include Wächter) ist eine Programmiertechnik, um in C oder C++ das Problem der doppelten Einbindung (engl.: double inclusion) zu umgehen. Dieses Problem tritt auf, wenn innerhalb eines Moduls mehrfach die gleiche Header… …   Deutsch Wikipedia

  • Guard rail — Guard rail, sometimes referred to as guide rail, is a system designed to keep people or vehicles from (in most cases unintentionally) straying into dangerous or off limits areas. A handrail is less restrictive than a guard rail and provides both… …   Wikipedia

  • Guard — This unusual name is an occupational surname for a watchman or guard. Derived from the pre 9th century old French word garde , meaning to watch, or protect, it was introduced into England after the Norman Conquest of 1066. From there on it was… …   Surnames reference

  • Guard Jaeger Regiment — Infobox Military Unit unit name= Kaartin Jääkärirykmentti caption=Flag of the Guard Jaeger Regiment dates= country=Finland branch=Army type= Foot Guards size=2 battalions [ Varusmiehiä kouluttavat joukko osastot 2008 . Reserviläinen 1/2008, p.38 …   Wikipedia

  • Dai-Guard — 地球防衛企業ダイ・ガード (Chikyū Bōei KiGyō Dai Gādo) Genre Mecha, Comedy, Science fiction TV anime Directed by …   Wikipedia

  • United States Coast Guard — portal Active 4 August 1790–present …   Wikipedia

  • Security guard — Private factory guard Occupation Activity sectors Security Description A security guard (or security officer) is a person who is paid to protect pro …   Wikipedia

  • Coast guard — For the 2002 South Korean film, see The Coast Guard (film). U.S. Coast Guard medium endurance cutter Vigilant (WMEC 617) …   Wikipedia

  • Organization of the United States Coast Guard — Table of Organization of the Coast Guard This article covers the organization of the United States Coast Guard. The headquarters of the Coast Guard is on 2100 Second Street, SW, in Washington, DC. The Coast Guard announced plans to relocate to… …   Wikipedia


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»