<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Präporozessor]]></title><description><![CDATA[<p>Guten Tag.</p>
<p>Ich habe mir vor 2Monaten ein Buch namens C++ Primer(vierte Auflage) gekauft und dabei arbeitete ich es bis heute durch,schritt für schritt.Nun aber bin ich bei einem sehr eigenartigen Punkt angestoßen,andem ich eure Hilfe brauchen werde.</p>
<p>Damit gemeint war soetwas in der Art ...</p>
<pre><code class="language-cpp">#ifndef SALESITEM_H
#define SALESITEM_H
//...
//..
//.
//.
//..
//...
#endif
</code></pre>
<p>-)Ich verstehe leider nicht den Sinn und Zweck dieser Beispieles <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Was <strong>#ifndef SALESITEM_H</strong> ist oder bedeutet,weiss ich irgendwie nicht.<br />
<strong>#define SALESITEM_H</strong> ist schon ein bisschen klarer geworden,dass man dabei etwas definiert.Und mit <strong>#endif</strong> gibt's auch keine Probleme,da es sicherlich heisst,dass dieser Schritt beendet wird.</p>
<p>-)<em>SALESITEM_H</em> könnte aber auch <em>SALESTEST_P</em> heissen, oder?</p>
<p>Also was es bedeutet und wozu gut es ist,das würde ich gerne irgendwie herausfinden wollen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Tutorials und anderes Zeugs würde mich auch erfreuen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>fragunfrag - Martin Kalesberger</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/156805/präporozessor</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 23:08:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/156805.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 Aug 2006 12:59:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Präporozessor on Sun, 20 Aug 2006 12:59:17 GMT]]></title><description><![CDATA[<p>Guten Tag.</p>
<p>Ich habe mir vor 2Monaten ein Buch namens C++ Primer(vierte Auflage) gekauft und dabei arbeitete ich es bis heute durch,schritt für schritt.Nun aber bin ich bei einem sehr eigenartigen Punkt angestoßen,andem ich eure Hilfe brauchen werde.</p>
<p>Damit gemeint war soetwas in der Art ...</p>
<pre><code class="language-cpp">#ifndef SALESITEM_H
#define SALESITEM_H
//...
//..
//.
//.
//..
//...
#endif
</code></pre>
<p>-)Ich verstehe leider nicht den Sinn und Zweck dieser Beispieles <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Was <strong>#ifndef SALESITEM_H</strong> ist oder bedeutet,weiss ich irgendwie nicht.<br />
<strong>#define SALESITEM_H</strong> ist schon ein bisschen klarer geworden,dass man dabei etwas definiert.Und mit <strong>#endif</strong> gibt's auch keine Probleme,da es sicherlich heisst,dass dieser Schritt beendet wird.</p>
<p>-)<em>SALESITEM_H</em> könnte aber auch <em>SALESTEST_P</em> heissen, oder?</p>
<p>Also was es bedeutet und wozu gut es ist,das würde ich gerne irgendwie herausfinden wollen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Tutorials und anderes Zeugs würde mich auch erfreuen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>fragunfrag - Martin Kalesberger</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120869</guid><dc:creator><![CDATA[fragunfrag]]></dc:creator><pubDate>Sun, 20 Aug 2006 12:59:17 GMT</pubDate></item><item><title><![CDATA[Reply to Präporozessor on Sun, 20 Aug 2006 13:00:31 GMT]]></title><description><![CDATA[<p>googlest du: &quot;include guard&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120871</guid><dc:creator><![CDATA[Helferlein]]></dc:creator><pubDate>Sun, 20 Aug 2006 13:00:31 GMT</pubDate></item><item><title><![CDATA[Reply to Präporozessor on Sun, 20 Aug 2006 13:14:17 GMT]]></title><description><![CDATA[<p>#ifndef = if not defined</p>
<p>Also wenn SALESITEM_H nicht definiert ist, geht es weiter. Wenn SALESITEM_H definiert ist, wird der Ablauf (in dem Fall das verarbeiten der Headerdatei) abgebrochen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120887</guid><dc:creator><![CDATA[Artchi@outdoor]]></dc:creator><pubDate>Sun, 20 Aug 2006 13:14:17 GMT</pubDate></item><item><title><![CDATA[Reply to Präporozessor on Sun, 20 Aug 2006 14:33:03 GMT]]></title><description><![CDATA[<p>fragunfrag schrieb:</p>
<blockquote>
<p>...<br />
Ich verstehe leider nicht den Sinn und Zweck dieser Beispieles :(...</p>
</blockquote>
<p>Kann ich verstehen. Das versteht man auch besser, wenn man es mal weggelassen und sich mit den Fehlermeldungen rumgeschlagen hat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> .</p>
<p>Diese Technik begegnet dem Problem, dass in einer Compile-Einheit &quot;alles&quot; (soll nur eine Faustregel sein; jetzt nicht mit namespace-Erweiterungen kommen !) nur einmal deklariert/definiert werden darf. Besonders bei einer Klasse reagieren Compiler (notwendigerweise) ablehnend, wenn sie doppelt deklariert sind.</p>
<p>Eigentlich macht das ja auch keiner, dass er denselben Klassennamen für zwei Klassen verwendet ... jedenfalls nicht absichtlich - und da ist der springende Punkt.<br />
Stell' Dir 3 Sourcen vor:</p>
<pre><code class="language-cpp">// includefile1.h
class A {
// irgendwas ...
};
</code></pre>
<pre><code class="language-cpp">// includefile2.h
#include &quot;includefile1.h&quot; // importiert die Deklaration von A
class B {
    A a; // &quot;hat&quot; ein A
};
</code></pre>
<p>und</p>
<pre><code class="language-cpp">// mainFile.cpp
#include &quot;includefile1.h&quot; // Deklaration von A
#include &quot;includefile2.h&quot; // Deklaration von B

int main(int argc, char* argv[]) {
    A a; // brauche ein A ...
    B B; // ... und ein B
// .... damit mache ich was
}
</code></pre>
<p>Der Präprozesser macht beim Compile von mainFile.cpp aus den #includes eigentlich nichts anderes, als ein Reinkopieren des jeweiligen Fileinhalts:<br />
deswegen bekommt der Compiler folgendes &quot;gereicht&quot;:</p>
<pre><code class="language-cpp">// &quot;#include &quot;includefile1.h&quot; // Deklaration von A &quot; wird zu:
class A {
// irgendwas ...
};

// &quot;#include &quot;includefile2.h&quot; // Deklaration von B&quot; wird zu:
// includefile2.h
// &quot;#include &quot;includefile1.h&quot; // importiert die Deklaration von A&quot; wird zu
// includefile1.h
class A {
// irgendwas ...
};

class B {
    A a; // &quot;hat&quot; ein A
};

int main(int argc, char* argv[]) {
    A a; // brauche ein A ...
    B B; // ... und ein B
// .... damit mache ich was
}
</code></pre>
<p>(mag imer noch ein wenig unübersichtlich sein, lohnt sich aber, das einmal durchzuspielen. Denk' ran : JEDES &quot;#include&quot; wird ersetzt durch den jeweiligen Dateiinhalt.)</p>
<p>Und Voilà: 2 Deklarationen der Klasse A !</p>
<blockquote>
<p>&gt; Compiler bricht ab mit Fehlermeldung &quot;Doppelte Klassendeklaration&quot; o.ä.</p>
</blockquote>
<p>In einem solch simplen Fall kann man diese Abhängigkeiten noch relativ einfach beherschen, wenn man das Inkludieren von includefile1.h in mainFile.cpp weglässt. Aber die Geschichte wird mit zunehmender Fileanzahl unübersichtlicher und unbeherrschbarer.</p>
<p>Einfacher ist es da, einen &quot;Schalter&quot; einzuführen, der dem Präprozesser sagt, ob dieses File schon inkludiert wurde oder nicht .... und dazu nimmt man konventionsgemäß eine Präproz-Variable, die genauso heißt wie das File selbst.</p>
<p>Dann kommt der Präproz das erste Mal an die Stelle</p>
<pre><code class="language-cpp">#ifndef INCLUDEFILE1_H_ // Nachschauen: &quot;Aha, INCLUDEFILE1_H_ ist noch nicht definiert, also hier weitermachen
#define INCLUDEFILE1_H_ // &quot;Aha: Hier also definieren und weiter&quot;

class A {                // Hier gibt's nix zu tun für den Präproz
// irgendwas
};

#endif                   // &quot;OK, weiter&quot;
</code></pre>
<p>Beim zweiten Mal, dass er das File inkludiert wird's dann interessant:</p>
<pre><code class="language-cpp">#ifndef INCLUDEFILE1_H_ // Nachschauen: &quot;Moooment: INCLUDEFILE1_H_ ist doch schon definiert, 
// also hier NICHT weitermachen, sondern das passenden #endif suchen
// und alle Zeile bis dahin überspringen
#endif                   // &quot;OK, weiter&quot;
</code></pre>
<p>Schwupp, schon ist die 2. Deklaration weg. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Lange Rede, kurzer Sinn: dieses Konstrukt ist eine &quot;Schalterabfrage&quot;, u8m Doppeltdeklarationen/-definitionen zu unterbinden.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120943</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sun, 20 Aug 2006 14:33:03 GMT</pubDate></item><item><title><![CDATA[Reply to Präporozessor on Sun, 20 Aug 2006 20:51:18 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>[...]<br />
Compiler bricht ab mit Fehlermeldung &quot;Doppelte Klassen<em>deklaration</em>&quot; o.ä.<br />
[...]</p>
</blockquote>
<p>Nop das stimmt nicht ganz: Du kannst Funktionen, Klassen (u.ä.) und auch externe Variablen so oft deklarieren wie du willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121135</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Sun, 20 Aug 2006 20:51:18 GMT</pubDate></item><item><title><![CDATA[Reply to Präporozessor on Mon, 21 Aug 2006 08:23:02 GMT]]></title><description><![CDATA[<p>CodeFinder schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>[...]<br />
Compiler bricht ab mit Fehlermeldung &quot;Doppelte Klassen<em>deklaration</em>&quot; o.ä.<br />
[...]</p>
</blockquote>
<p>Nop das stimmt nicht ganz: Du kannst Funktionen, Klassen (u.ä.) und auch externe Variablen so oft deklarieren wie du willst.</p>
</blockquote>
<p>Wenn man &quot;o.ä.&quot; schreibt, stimmt's eigentlich immer <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ....</p>
<p>OK, ich glaube zwar nicht, dass jemandem, der &quot;include guards&quot; nicht kennt, mit einer &quot;Deklaration/Definition&quot;-Debatte weitergeholfen wird (oder durch den &quot;nackten&quot; Hinweis, man könne so oft deklarieren, wie man will - weiß er wirklich, was jetzt an meiner Aussage falsch war und was ihn einer Lösung näherbringt ?), aber:</p>
<p>1 Zeile Code sagt mehr als 1000 Worte:<br />
<strong>erlaubt:</strong></p>
<pre><code class="language-cpp">class A; // forward Deklaration

class A {
    int f();
};
</code></pre>
<p><strong>NICHT erlaubt:</strong></p>
<pre><code class="language-cpp">class A {
    int f();
};

class A {
    int f();
};
</code></pre>
<p>-&gt; &quot;Compilermeldung: error: redefinition of `class A' ...previous definition of `class A'...&quot;<br />
Hier spricht er offensichtlich von &quot;Definition&quot; und nicht von Deklaration. Oben habe ich &quot;Deklaration&quot; gesagt, um mich von der &quot;Definition der Memberfunktionen&quot; abzugrenzen ... Wollte damit ausdrücken: &quot;das Problem kann man nicht dadurch ausmerzen, dass man Fkt-Def. in ein cpp auslagert&quot;.</p>
<p>Aber danke für die Klarstellung. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121280</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 21 Aug 2006 08:23:02 GMT</pubDate></item><item><title><![CDATA[Reply to Präporozessor on Mon, 21 Aug 2006 22:32:28 GMT]]></title><description><![CDATA[<p>Wollte nur den Unterschied zwischen Deklaration und Definition darstellen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>:</p>
<pre><code class="language-cpp">class A; // (Forward) Deklaration
class A; // (Forward) Deklaration
class A; // (Forward) Deklaration
class A; // (Forward) Deklaration
class A; // (Forward) Deklaration
class A; // (Forward) Deklaration
class A; // (Forward) Deklaration

class A { // Definition der Klasse A
    int f();
};
/*   /!\ FEHLER /!\
class A { // Definition der Klasse A
    int f();
};
/!\ FEHLER /!\   */

int A::f()
{
  return (1-1+0); // ^^
}
/*   /!\ FEHLER /!\
int A::f()
{
  return (1-1+0); // ^^
}
};
/!\ FEHLER /!\   */
</code></pre>
<p>PS: Dein letzter Post war natürlich rischtisch. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121890</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Mon, 21 Aug 2006 22:32:28 GMT</pubDate></item></channel></rss>