<?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äprozessor und #include ignorieren]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>ich habe folgendes Problem:</p>
<p>Ich habe z.B. eine Klasse foo</p>
<pre><code class="language-cpp">#ifndef FOO_H_
#define FOO_H_

#include &lt;c++ Stuff&gt;

#include &lt;boost library path&gt;

#endif

class FOO {
  /* declare something
     implementeation in foo.cpp */
};
</code></pre>
<p>Und dann natürlich eine main</p>
<pre><code class="language-cpp">#include &quot;foo.h&quot;

int main() {
  /* something */

  return 0;
}
</code></pre>
<p>Jetzt habe ich folgendes Problem bei Kompilieren:</p>
<p>Ich kompiliere zunächst zunächst foo.cpp unter Angabe des Pfades zu z.B. Boost mittels <code>-I/usr/local/boost_1_55_0/</code></p>
<p>Jetzt will ich <code>main.cpp</code> kompilieren natürlich <code>ohne</code> Angabe des Pfades, denn alles was mit boost zu tun hat, wurde bereits bei der Kompilierung von <code>foo.cpp</code> abgehandelt.</p>
<p>Und nun merke ich, dass ich diese include guards noch nicht richtig verstanden habe, denn der Kompiler meckert bei der Kompilierung von <code>main.cpp</code> , dass er z.B. Methoden aus Boost nicht findet (weil ich den Pfad nicht angebe, klar).</p>
<p>Ich dachte das mit den include guards funktioniert so:</p>
<ol>
<li><code>foo.cpp</code> wird kompiliert. Dabei existiert noch kein <code>FOO_H_</code> , d.h. zum Einen wird dieses Symbol (diese Variable?) angelegt und anschließend alles includiert.</li>
<li><code>main.cpp</code> wird kompiliert. Es fügt <code>foo.h</code> und check, ob <code>FOO_H_</code> bereits existiert - jap, tut es. Also sollte das nachfolgende doch nicht mehr includiert werden - was is also das Problem? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Denn ich dachte, dass <code>main.cpp</code> sich lediglich die Deklarationen aus der Klasse holt (wo eben keine boost Funktionen drin sind) und anschließend beim Linken die Referenzen aufgelöst werden. Da aber zuvor <code>foo.cpp</code> erfolgreich kompiliert wurde, sind die Referenzen doch vorhanden.</li>
</ol>
<p>Viele Grüße,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/328442/präprozessor-und-include-ignorieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 17:18:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328442.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Oct 2014 09:52:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Präprozessor und #include ignorieren on Fri, 10 Oct 2014 09:52:12 GMT]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>ich habe folgendes Problem:</p>
<p>Ich habe z.B. eine Klasse foo</p>
<pre><code class="language-cpp">#ifndef FOO_H_
#define FOO_H_

#include &lt;c++ Stuff&gt;

#include &lt;boost library path&gt;

#endif

class FOO {
  /* declare something
     implementeation in foo.cpp */
};
</code></pre>
<p>Und dann natürlich eine main</p>
<pre><code class="language-cpp">#include &quot;foo.h&quot;

int main() {
  /* something */

  return 0;
}
</code></pre>
<p>Jetzt habe ich folgendes Problem bei Kompilieren:</p>
<p>Ich kompiliere zunächst zunächst foo.cpp unter Angabe des Pfades zu z.B. Boost mittels <code>-I/usr/local/boost_1_55_0/</code></p>
<p>Jetzt will ich <code>main.cpp</code> kompilieren natürlich <code>ohne</code> Angabe des Pfades, denn alles was mit boost zu tun hat, wurde bereits bei der Kompilierung von <code>foo.cpp</code> abgehandelt.</p>
<p>Und nun merke ich, dass ich diese include guards noch nicht richtig verstanden habe, denn der Kompiler meckert bei der Kompilierung von <code>main.cpp</code> , dass er z.B. Methoden aus Boost nicht findet (weil ich den Pfad nicht angebe, klar).</p>
<p>Ich dachte das mit den include guards funktioniert so:</p>
<ol>
<li><code>foo.cpp</code> wird kompiliert. Dabei existiert noch kein <code>FOO_H_</code> , d.h. zum Einen wird dieses Symbol (diese Variable?) angelegt und anschließend alles includiert.</li>
<li><code>main.cpp</code> wird kompiliert. Es fügt <code>foo.h</code> und check, ob <code>FOO_H_</code> bereits existiert - jap, tut es. Also sollte das nachfolgende doch nicht mehr includiert werden - was is also das Problem? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Denn ich dachte, dass <code>main.cpp</code> sich lediglich die Deklarationen aus der Klasse holt (wo eben keine boost Funktionen drin sind) und anschließend beim Linken die Referenzen aufgelöst werden. Da aber zuvor <code>foo.cpp</code> erfolgreich kompiliert wurde, sind die Referenzen doch vorhanden.</li>
</ol>
<p>Viele Grüße,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421586</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Fri, 10 Oct 2014 09:52:12 GMT</pubDate></item><item><title><![CDATA[Reply to Präprozessor und #include ignorieren on Fri, 10 Oct 2014 10:10:54 GMT]]></title><description><![CDATA[<p>Klaus82 schrieb:</p>
<blockquote>
<ol>
<li><code>foo.cpp</code> wird kompiliert. Dabei existiert noch kein <code>FOO_H_</code> , d.h. zum Einen wird dieses Symbol (diese Variable?) angelegt und anschließend alles includiert.</li>
</ol>
</blockquote>
<p>Richtig. (Bis auf die Wortwahl: Es ist weder ein Symbol noch eine Variable, sondern ein Präprozessorsymbol)</p>
<blockquote>
<ol start="2">
<li><code>main.cpp</code> wird kompiliert. Es fügt <code>foo.h</code> und check, ob <code>FOO_H_</code> bereits existiert - jap, tut es.</li>
</ol>
</blockquote>
<p>Falsch. Neue Übersetzungseinheit (neue .cpp-Datei), also sind auch alle Präprozessorsymbole weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421590</guid><dc:creator><![CDATA[SG1]]></dc:creator><pubDate>Fri, 10 Oct 2014 10:10:54 GMT</pubDate></item><item><title><![CDATA[Reply to Präprozessor und #include ignorieren on Fri, 10 Oct 2014 10:14:35 GMT]]></title><description><![CDATA[<p>Klaus82 schrieb:</p>
<blockquote>
<p>Ich dachte das mit den include guards funktioniert so:</p>
<ol>
<li><code>foo.cpp</code> wird kompiliert. Dabei existiert noch kein <code>FOO_H_</code> , d.h. zum Einen wird dieses Symbol (diese Variable?) angelegt und anschließend alles includiert.</li>
<li><code>main.cpp</code> wird kompiliert. Es fügt <code>foo.h</code> und check, ob <code>FOO_H_</code> bereits existiert - jap, tut es.</li>
</ol>
</blockquote>
<p>Nein, tut es nicht.</p>
<p>Schau dir nochmal an, wie der Präprozessor funktioniert. Du kannst beim gcc auch mit gcc -E den Code nach dem Präprozessor ausgeben lassen, das ist vielleicht mal ganz interessant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421592</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 10 Oct 2014 10:14:35 GMT</pubDate></item><item><title><![CDATA[Reply to Präprozessor und #include ignorieren on Fri, 10 Oct 2014 10:17:34 GMT]]></title><description><![CDATA[<p>SG1 schrieb:</p>
<blockquote>
<blockquote>
<ol start="2">
<li><code>main.cpp</code> wird kompiliert. Es fügt <code>foo.h</code> und check, ob <code>FOO_H_</code> bereits existiert - jap, tut es.</li>
</ol>
</blockquote>
<p>Falsch. Neue Übersetzungseinheit (neue .cpp-Datei), also sind auch alle Präprozessorsymbole weg.</p>
</blockquote>
<p>Hä? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Ich dachte diese include guards sollen helfen, falls eine Datei in verschiedene Dateien öfter eingebunden wird. Falls diese Präprozessorsymbole aber bei jeder dieser verschiedenen Dateien wieder verworfen werden, wie kann die include guard dann helfen?</p>
<p>Ich dachte das sei genau dafür gedacht, dass ich nicht noch einmal alles neu einbauen musse, wenn es bereits (wie z.B. im Falle von <code>foo.h</code> ) geschehen ist. Aber das ist gerade nicht der Fall? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> ?</p>
<p>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421594</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Fri, 10 Oct 2014 10:17:34 GMT</pubDate></item><item><title><![CDATA[Reply to Präprozessor und #include ignorieren on Fri, 10 Oct 2014 10:20:26 GMT]]></title><description><![CDATA[<p>Include Guards sollen verhindern, dass ein Header <em>innerhalb einer Übersetzungseinheit</em> mehrfach eingebunden wird (z.B. indirekt über andere Header).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421595</guid><dc:creator><![CDATA[SG1]]></dc:creator><pubDate>Fri, 10 Oct 2014 10:20:26 GMT</pubDate></item><item><title><![CDATA[Reply to Präprozessor und #include ignorieren on Fri, 10 Oct 2014 10:21:52 GMT]]></title><description><![CDATA[<p>Include Guards herlfen nur dagegen:</p>
<pre><code>#include &quot;foo&quot;
#include &quot;foo&quot;
</code></pre>
<p>Der Include Guard fängt das zweite Include ab und verhindert damit Compilerfehler.<br />
In der echten Welt ist es natürlich eher so dass du a und b inkludierst die zufälligerweise beide c inkludieren. Ohne Include Guard hättest du 2x c eingebunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421596</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 10 Oct 2014 10:21:52 GMT</pubDate></item><item><title><![CDATA[Reply to Präprozessor und #include ignorieren on Fri, 10 Oct 2014 10:25:55 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Schau dir nochmal an, wie der Präprozessor funktioniert. Du kannst beim gcc auch mit gcc -E den Code nach dem Präprozessor ausgeben lassen, das ist vielleicht mal ganz interessant.</p>
</blockquote>
<p>Boa, was ist das denn? Ein simples hello world Programm liefert bei der -E Option eine Ausgabe von ~17.000 Zeilen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Ich sehe schon, ich wieder viel zu lernen habe ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Aber was ist jetzt der richtige Ansatzpunkt, um weiter zu machen?</p>
<p>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421599</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Fri, 10 Oct 2014 10:25:55 GMT</pubDate></item><item><title><![CDATA[Reply to Präprozessor und #include ignorieren on Fri, 10 Oct 2014 10:38:36 GMT]]></title><description><![CDATA[<p>Klaus82 schrieb:</p>
<blockquote>
<p>Aber was ist jetzt der richtige Ansatzpunkt, um weiter zu machen?</p>
</blockquote>
<p>Du meinst abgesehen davon, endlich mal zu verstehen, was der Präprozessor macht? In main.cpp das includieren, was du dort brauchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421601</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 10 Oct 2014 10:38:36 GMT</pubDate></item><item><title><![CDATA[Reply to Präprozessor und #include ignorieren on Fri, 10 Oct 2014 10:40:13 GMT]]></title><description><![CDATA[<p>Klaus82 schrieb:</p>
<blockquote>
<p>Aber was ist jetzt der richtige Ansatzpunkt, um weiter zu machen?</p>
</blockquote>
<p>Wenn boost nur in foo.cpp verwendet wird, gehört die Includeanweisung auch dahin und nicht in den Header.</p>
<p>Übersetzt du jede Datei einzeln per Compileraufruf? Includepfade werden normalerweise im Makefile oder dem &quot;Projekt&quot; der IDE global gesetzt =&gt; das Problem existiert nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421602</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 10 Oct 2014 10:40:13 GMT</pubDate></item><item><title><![CDATA[Reply to Präprozessor und #include ignorieren on Fri, 10 Oct 2014 11:50:40 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Übersetzt du jede Datei einzeln per Compileraufruf?</p>
</blockquote>
<p>Ich dachte das ist der Vorteil bzw. Gedanke von Objektorientiert programmieren?</p>
<p>Ich bastle eine Klasse und teile die Deklaration und Implementierung auf header und cpp Datei auf. Dann kompiliere ich die cpp Datei.</p>
<p>Ich muss meinem Kollegen also lediglich sagen, wie er die src file zu kompilieren hat, z.B. boost Verzeichnis includieren und wie die Memberfunctions aufgerufen werden.</p>
<p>Wenn mein Kollege aber jetzt in jeder Datei, die meine Klasse verwendet, <code>wiederholt</code> z.B. boost includieren muss, dann wird er sich zu recht aufregen.</p>
<p>Oder ist das kein Inhalt von OOP, sondern Präprozessor bzw. Compiler?</p>
<p>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421608</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Fri, 10 Oct 2014 11:50:40 GMT</pubDate></item><item><title><![CDATA[Reply to Präprozessor und #include ignorieren on Fri, 10 Oct 2014 12:08:45 GMT]]></title><description><![CDATA[<p>Klaus82 schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Übersetzt du jede Datei einzeln per Compileraufruf?</p>
</blockquote>
<p>Ich dachte das ist der Vorteil bzw. Gedanke von Objektorientiert programmieren?</p>
</blockquote>
<p>Nein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421610</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 10 Oct 2014 12:08:45 GMT</pubDate></item><item><title><![CDATA[Reply to Präprozessor und #include ignorieren on Fri, 10 Oct 2014 12:20:52 GMT]]></title><description><![CDATA[<p>Okay.</p>
<p>Dann stelle ich die zu durchsuchenden Pfade einfach global ein und die Sache hat sich erledigt.</p>
<p>Viele Grüße,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421612</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Fri, 10 Oct 2014 12:20:52 GMT</pubDate></item></channel></rss>