<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Include-Guard</id>
	<title>Include-Guard - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Include-Guard"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Include-Guard&amp;action=history"/>
	<updated>2026-05-20T06:28:47Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Include-Guard&amp;diff=2387290&amp;oldid=prev</id>
		<title>imported&gt;TaxonBot: Bot: Auflösung doppelter toter Links nach https://de.wikipedia.org/w/index.php?title=Wikipedia:Bots/Anfragen&amp;oldid=266185123#Aufl%C3%B6sung_der_doppelten_Toten_Links</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Include-Guard&amp;diff=2387290&amp;oldid=prev"/>
		<updated>2026-04-16T20:34:36Z</updated>

		<summary type="html">&lt;p&gt;Bot: Auflösung doppelter toter Links nach https://de.wikipedia.org/w/index.php?title=Wikipedia:Bots/Anfragen&amp;amp;oldid=266185123#Aufl%C3%B6sung_der_doppelten_Toten_Links&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Der &amp;#039;&amp;#039;&amp;#039;Include-Guard&amp;#039;&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;&amp;#039;Include-Wächter&amp;#039;&amp;#039;&amp;#039; ist eine Programmiertechnik, um in [[C (Programmiersprache)|C]] und [[C++]] das Problem der mehrfachen Einbindung zu lösen.&lt;br /&gt;
&lt;br /&gt;
Dieses Problem tritt auf, wenn innerhalb einer &amp;#039;&amp;#039;Übersetzungseinheit&amp;#039;&amp;#039; mehrmals die gleiche [[Header-Datei]] eingebunden wird. Das geschieht in der Regel unbeabsichtigt, z.&amp;amp;nbsp;B. wenn mehrere Module die gleiche [[Programmbibliothek|Bibliothek]] benutzen.&lt;br /&gt;
&lt;br /&gt;
== Beispiel einer Mehrfacheinbindung ==&lt;br /&gt;
Gegeben seien die folgenden beiden [[Header-Datei]]en &amp;lt;code&amp;gt;A.h&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;B.h&amp;lt;/code&amp;gt;, die u.&amp;amp;nbsp;a. jeweils eine [[Klasse (Programmierung)|Klasse]] definieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// A.h&lt;br /&gt;
const int M = 123;&lt;br /&gt;
&lt;br /&gt;
class A&lt;br /&gt;
{ /* ... */ };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// B.h&lt;br /&gt;
#include &amp;quot;A.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class B : public A&lt;br /&gt;
{ /* ... */ };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Hauptprogramm sollen nun sowohl die Klasse &amp;#039;&amp;#039;A&amp;#039;&amp;#039; als auch &amp;#039;&amp;#039;B&amp;#039;&amp;#039; genutzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// program.cpp&lt;br /&gt;
#include &amp;quot;A.h&amp;quot;&lt;br /&gt;
#include &amp;quot;B.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main() { /* ... */ }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm lässt sich nicht fehlerfrei kompilieren, weil die Klasse A doppelt definiert wird: Die erste Definition erfolgt beim Einbinden der Header-Datei &amp;lt;code&amp;gt;A.h&amp;lt;/code&amp;gt; in Zeile 2. Die zweite Definition erfolgt, weil die Header-Datei &amp;lt;code&amp;gt;B.h&amp;lt;/code&amp;gt;, die in Zeile 3 eingebunden wird, selbst wiederum &amp;lt;code&amp;gt;A.h&amp;lt;/code&amp;gt; einbindet. Die Klasse (und ggf. weitere Variablen) aus dieser Datei wurden bereits zuvor definiert, was zu einem Fehler der [[Compiler|Kompilierung]] führt.&lt;br /&gt;
&lt;br /&gt;
== Lösung mit Präprozessor-Makros (#ifndef) ==&lt;br /&gt;
Der &amp;#039;&amp;#039;[[C-Präprozessor#Bedingte Ersetzung|#ifndef]]-Wrapper&amp;#039;&amp;#039; ist der traditionelle und C-konforme Ansatz. Das Problem der Mehrfacheinbindung wird durch Definition eines eindeutigen [[C-Präprozessor#Definition und Ersetzung von Makros|Präprozessor-Makros]] beim ersten Einbinden der Header-Datei gelöst. War das Makro bereits definiert, werden die nachfolgenden Definitionen des Headers übersprungen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// A.h&lt;br /&gt;
#ifndef A_H&lt;br /&gt;
#define A_H&lt;br /&gt;
&lt;br /&gt;
class A&lt;br /&gt;
{ /* ... */ };&lt;br /&gt;
&lt;br /&gt;
#endif /* A_H */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die obenstehenden Präprozessor-Befehle bewirken, dass beim erstmaligen Einbinden von &amp;#039;&amp;#039;A.h&amp;#039;&amp;#039; (aus &amp;#039;&amp;#039;program.cpp&amp;#039;&amp;#039;) das Makro &amp;#039;&amp;#039;A_H&amp;#039;&amp;#039; noch nicht definiert ist und der [[C-Präprozessor|Präprozessor]] die Definitionen durchläuft. Beim zweiten Einbinden (aus &amp;#039;&amp;#039;B.h&amp;#039;&amp;#039;) ist das Makro bereits definiert und der Präprozessor überspringt den Block &amp;#039;&amp;#039;#ifndef … #endif&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Da Makros im globalen Namensraum existieren, kann es hier zu Problemen kommen, wenn versucht wird, den gleichen Namen an anderer Stelle zu verwenden (sog. {{lang|en|&amp;#039;&amp;#039;namespace pollution&amp;#039;&amp;#039;}}). Dem kann durch die Festlegung von Namenskonventionen zwar vorgebeugt werden, es löst das Problem dennoch nicht.&amp;lt;ref&amp;gt;{{Toter Link |datum=2018-04 |url=http://blogs.msdn.com/b/ericflee/archive/2008/04/17/pragma-once.aspx |text=Eric Fleegal’s WebLog |archivebot=2018-04-15 22:40:35 InternetArchiveBot}} on [[MSDN]] Blogs; abgerufen am 19. August 2011.&amp;lt;/ref&amp;gt;&lt;br /&gt;
Für compiler-eigene Definitionen und Definitionen in den Standard-Bibliotheken sind [[Bezeichner]] mit führendem Unterstrich (_) reserviert. Ein führender Unterstrich darf nach den aktuellen C- und C++-Standards daher nicht im Applikationscode verwendet werden.&amp;lt;ref&amp;gt;C++ standard (ISO/IEC 14882); [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf C++ working draft N3242] (PDF; 10&amp;amp;nbsp;MB), Abschnitt 17.6.4.3.2&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;C standard (ISO/IEC 9899); [http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf Committee Draft N1124] (PDF; 3,3&amp;amp;nbsp;MB), Abschnitte 6.10.8 und 7.1.3/1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der &amp;#039;&amp;#039;CPP&amp;#039;&amp;#039;, der Präprozessor der [[GNU Compiler Collection|GCC]], erkennt solche Konstrukte automatisch, merkt sich die entsprechenden Dateien und überspringt diese bei nochmaligem Einbinden.&amp;lt;ref name=&amp;quot;cpp_onceonlyheaders&amp;quot;&amp;gt;[https://gcc.gnu.org/onlinedocs/cpp/Once-Only-Headers.html#Once-Only-Headers Once-Only Headers] im GNU CPP Online Manual. Abgerufen am 19. August 2011.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Lösung über Spracherweiterungen (#pragma once) ==&lt;br /&gt;
Die meisten gebräuchlichen C- und C++-Compiler unterstützen heute die Spracherweiterung &amp;lt;code&amp;gt;#pragma once&amp;lt;/code&amp;gt;. Diese sorgt ebenfalls dafür, dass eine (Header-)Datei nur einmal eingebunden wird, setzt jedoch auf höherer Ebene, direkt am Präprozessor, an und führt auch keine Makros in den globalen Namensraum ein.&lt;br /&gt;
&lt;br /&gt;
Zur Verwendung genügt es, innerhalb der Header-Datei die Präprozessordirektive &amp;lt;code&amp;gt;#pragma once&amp;lt;/code&amp;gt; einzufügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// A.h&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
class A&lt;br /&gt;
{ /* ... */ };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Spracherweiterung wird von den folgenden C++-Implementierungen unterstützt:&lt;br /&gt;
* [[GNU Compiler Collection|GCC]],&amp;lt;ref&amp;gt;[https://gcc.gnu.org/gcc-3.4/changes.html GCC 3.4 Release Series – Changes, New Features, and Fixes]. Abgerufen am 16. Mai 2014.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[Clang]],&amp;lt;ref&amp;gt; {{Webarchiv|text=clang: Pragma.cpp Source File |url=http://clang.llvm.org/doxygen/Pragma_8cpp-source.html |wayback=20140404052351 |archiv-bot=2018-04-15 22:40:35 InternetArchiveBot }}. Abgerufen am 16. Mai 2014.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[Microsoft Visual C++]],&amp;lt;ref&amp;gt;[http://msdn.microsoft.com/en-us/library/4141z1cx(v=vs.120).aspx MS Developer Network – once (C/C++)]. Abgerufen am 16. Mai 2014.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[Intel C++ Compiler]],&lt;br /&gt;
* [[Comeau C++|Comeau C/C++]],&amp;lt;ref&amp;gt;{{Webarchiv|url=http://www.comeaucomputing.com/4.0/docs/userman/pragma.html |wayback=20131211122659 |text=Comeau C++ 4.0 |archiv-bot=2019-09-11 17:36:32 InternetArchiveBot }}−{{Webarchiv|url=http://www.comeaucomputing.com/4.0/docs/userman/pragma.html |wayback=20131211122659 |text=Pre-Release – User-Documentation: Pragmas |archiv-bot=2019-09-11 17:36:32 InternetArchiveBot }}. Abgerufen am 16. Mai 2014.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[C++Builder]] XE3,&amp;lt;ref&amp;gt;[http://docwiki.embarcadero.com/RADStudio/XE3/en/Pragma_once #pragma once - RAD Studio XE3]. Abgerufen am 16. Mai 2014.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[Digital Mars C++]].&amp;lt;ref&amp;gt;[http://www.digitalmars.com/ctg/pragmas.html#once Pragmas #pragma once]. Abgerufen am 16. Mai 2014.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C (Programmiersprache)]]&lt;br /&gt;
[[Kategorie:C++]]&lt;/div&gt;</summary>
		<author><name>imported&gt;TaxonBot</name></author>
	</entry>
</feed>