Include Guard

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-Datei eingebunden wird. Das geschieht in der Regel unbeabsichtigt, zum Beispiel wenn mehrere Header-Dateien die gleiche Bibliothek benutzen.

Inhaltsverzeichnis

Beispiel

// A.h
const int M = 123;
 
class A
{ /* ... */ };


// B.h
#include "A.h"
 
class B : public A
{ /* ... */ };


Im Hauptprogramm möchte man nun sowohl die Klasse A als auch B nutzen:

// program.c
#include "A.h"
#include "B.h"
 
int main() { /* ... */ }

Der Compiler liefert einen Fehler, weil eine Klasse oder Variable nochmals definiert wird (engl.: redefinition).

#ifndef Wrapper (oder Makro-Guard)

Der #ifndef-Wrapper ist der traditionelle und C-konforme Ansatz. Er versucht das Problem zu lösen, indem er ein eindeutiges Makro beim ersten Einbinden der Header-Datei definiert. Ist dieses Makro bereits definiert, werden die Definitionen des Headers übersprungen:

// A.h
#ifndef _A_H_
#define _A_H_
 
class A
{ /* ... */ };
 
#endif /* _A_H_ */

Im obigen Beispiel bewirkt das, dass beim erstmaligen Einbinden von A.h (aus program.cpp) das Makro _A_H_ noch nicht definiert ist und der Präprozessor die Definitionen durchläuft. Beim zweiten Einbinden (aus B.h) ist das Makro bereits definiert und der Präprozessor überspringt den #ifndef .. #endif-Block.

Das eigentliche Problem mit dieser Technik ist die sog. namespace pollution: die definierten Makros liegen im globalen Namensraum und „verschmutzen“ diesen mit steigender Anzahl zusehends. Dem kann durch die Festlegung von Namenskonventionen zwar vorgebeugt werden, dies löst das Problem jedoch nicht[1].

Der CPP, der Präprozessor des GCC, erkennt solche Konstrukte automatisch, merkt sich die entsprechenden Dateien und überspringt diese bei nochmaligem Einbinden[2].

#pragma Guard

Sowohl der Microsoft C/C++ Compiler[3] als auch der GCC[4] unterstützen heute die Präprozessor-Direktive #pragma once. Diese sorgt ebenfalls dafür, dass eine (Header-)Datei nur einmalig eingebunden wird, setzt jedoch auf höherer Ebene an (direkt am Präprozessor) und führt auch keine Makros in den globalen Namensraum ein.

Zur Verwendung genügt es innerhalb der Header-Datei die Anweisung #pragma once einzufügen:

// A.h
#pragma once
 
class A
{ /* ... */ };

Gerade bei portablem Code muss jedoch beachtet werden, dass dies eine Compiler-spezifische Erweiterung ist und nicht zwingend von jedem C/C++-Compiler unterstützt wird[4].

Siehe auch

Einzelnachweise

  1. Eric Fleegal's WebLog on MSDN Blogs. Abgerufen am 19. August 2011.
  2. Once-Only Headers im GNU CPP Online Manual. Abgerufen am 19. August 2011.
  3. MSDN Visual Studio 2010 - once
  4. a b Alternatives to Wrapper #ifndef im GNU CPP Online Manual. Abgerufen am 19. August 2011.

Wikimedia Foundation.

Игры ⚽ Нужно сделать НИР?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • 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 — Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей …   Википедия

  • 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

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”