Tartalmazza az őrt

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt hozzászólók, és jelentősen eltérhet a 2013. június 25-én felülvizsgált verziótól ; az ellenőrzések 14 szerkesztést igényelnek .

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

Kettős kapcsolat

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.

#include őrök

nagypapa.h fájl #ifndef H_NAGYAPA #define H_NAGYAPA struct foo { int tag ; }; #endif apa.h fájl #include "nagyapa.h" child.c fájl #include "nagyapa.h" #include "father.h"

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.

Használati problémák

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.

Lásd még

További források