A C és C++ programozási nyelvekben az #include guards ( connection protection ), amelyet néha makróőrnek is neveznek , egy speciális konstrukció, amely a "kettős vezetékezési" problémák elkerülésére szolgál fordítói direktíva használatakor . Az #include védőelemek fejlécfájlhoz való hozzáadása az egyik módja annak, hogy a fájlt idempotenssé tegyük , ami azt jelenti, hogy több beillesztés egyenértékű eggyel, és nem okoz hibákat. #include
A következő C kódrészlet bemutatja azokat a lehetséges problémákat, amelyek akkor fordulhatnak elő, ha az #include védőelemeket kihagyják:
nagypapa.h fájl struct foo { int tag ; }; apa.h fájl #include "nagyapa.h" child.c fájl #include "nagyapa.h" #include "father.h"Itt a "grandfather.h" fejlécfájl két példánya közvetlenül kapcsolódik a "child.c" fájlhoz . Ez fordítási hibát okozhat, mivel a footípusstruktúra kétszer van kifejezetten definiálva.
Ebben a példában a "grandfather.h" fájl első felvétele határozza meg a makróazonosítót H_GRANDFATHER . Továbbá, ha a "grandfather.h" másodszor is szerepel a "child.c"-ben, az irányelv nem definiált azonosítóra vonatkozó ellenőrzése #ifndefmeghiúsul, és az előfeldolgozó mindent kihagy az irányelvig #endif, így elkerüli a második definíciót struct foo. Ennek eredményeként a program megfelelően összeáll.
Az #include őrök helyes működéséhez mindegyiküknek saját egyedi előfeldolgozó makróazonosítóját kell használnia (ellenőriznie és definiálnia). Ezért az #include őröket használó projektben a makróazonosítók egységes elnevezési rendszerét kell betartani, és az összes használt azonosító nem fedheti át (egybe) sem egymást, sem a projektben használt harmadik féltől származó fejlécfájlok azonosítóit és a makróazonosítókat. globális láthatósággal.
E problémák megoldása érdekében a legtöbb C és C++ implementáció támogatja a nem szabványos direktívát #pragma once. A fejlécfájl elejére beszúrva ez az irányelv egyre korlátozza a fájl kapcsolatainak számát. Ennek a megközelítésnek azonban megvan az a hátránya, hogy potenciálisan megnehezíti annak észlelését, ha két #includekülönböző opciókkal rendelkező direktíva ténylegesen ugyanarra a fejlécfájlra hivatkozik (például szimbolikus hivatkozás használata Unix -szerű rendszereken). Sőt, mivel ez #pragma oncenem egy szabványos direktíva, szemantikája az alkalmazástól függően nagyon eltérő lehet.