<?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[Frage zur Arbeit des Compilers]]></title><description><![CDATA[<p>Hallo!</p>
<p>Momentan beschäftige ich mich mit dem C++-Compiler und dem Präprozessor.<br />
Leider gibts einige Unsicherheiten, die auch nirgendwo erklärt sind:</p>
<p>1.Ist es richtig, dass alle Deklarationen von Variablen und Klassen schon vor dem Programmablauf dem Compiler bekannt gemacht werden ? Wenn ich z.B. schreibe</p>
<p>int a;<br />
int b = 5;</p>
<p>class CPlayer<br />
{<br />
// ....<br />
}</p>
<p>2. Bei #include-Direktiven soll ja vom Präprozessor einfach der Code des entsprechneden Moduls an die Stelle der Direktive gesetzt werden.</p>
<p>Wenn man nun z.B. schreibt</p>
<p>using namespace std;</p>
<p>int main()<br />
{<br />
cout &lt;&lt; &quot;xyz&quot; &lt;&lt; endl;<br />
}</p>
<p>#include &lt;iostream&gt;</p>
<p>Dann funktioniert das Programm ja nicht. Aber es ist doch richtig, dass:<br />
1. Der Präprozessor durch das Programm läuft und mein #include &lt;iostream&gt; durch die entsprechenden Funktionen ersetzt<br />
2. Der Compiler das Programm kompiliert und dann nicht über den cout-Befehl verfügt, weil dieser erst unterhalb des &quot;#include &lt;iostream&gt;&quot; verfügbar ist ? Das &quot;#include &lt;iostream&gt;&quot; wurde ja erst geshriebven, nachdem es schon eingesetzt wurde.</p>
<p>3. Bei der #define-Direktive: die ist ja auch ein Präprozessor-Befehl.<br />
Wenn man nun schreibt:</p>
<p>#define C 10</p>
<p>int main()<br />
{<br />
cout &lt;&lt; C &lt;&lt; endl;<br />
cout &lt;&lt; A &lt;&lt; endl;<br />
}</p>
<p>#define A 15</p>
<p>Dann gibt es eine Fehlermeldung. Liegt es daran, dass der Präprozessor sozusagen das Programm von oben nach unten durchläuft und die Textersetzungen nur vornimmt, wenn ihm die Konstante (also A bzw. C) schon bekannt ist ?</p>
<p>Herzliche Grüße und Danke im Voraus</p>
<p>Monadic512</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290412/frage-zur-arbeit-des-compilers</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 03:02:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290412.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Jul 2011 09:03:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur Arbeit des Compilers on Tue, 26 Jul 2011 09:03:51 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Momentan beschäftige ich mich mit dem C++-Compiler und dem Präprozessor.<br />
Leider gibts einige Unsicherheiten, die auch nirgendwo erklärt sind:</p>
<p>1.Ist es richtig, dass alle Deklarationen von Variablen und Klassen schon vor dem Programmablauf dem Compiler bekannt gemacht werden ? Wenn ich z.B. schreibe</p>
<p>int a;<br />
int b = 5;</p>
<p>class CPlayer<br />
{<br />
// ....<br />
}</p>
<p>2. Bei #include-Direktiven soll ja vom Präprozessor einfach der Code des entsprechneden Moduls an die Stelle der Direktive gesetzt werden.</p>
<p>Wenn man nun z.B. schreibt</p>
<p>using namespace std;</p>
<p>int main()<br />
{<br />
cout &lt;&lt; &quot;xyz&quot; &lt;&lt; endl;<br />
}</p>
<p>#include &lt;iostream&gt;</p>
<p>Dann funktioniert das Programm ja nicht. Aber es ist doch richtig, dass:<br />
1. Der Präprozessor durch das Programm läuft und mein #include &lt;iostream&gt; durch die entsprechenden Funktionen ersetzt<br />
2. Der Compiler das Programm kompiliert und dann nicht über den cout-Befehl verfügt, weil dieser erst unterhalb des &quot;#include &lt;iostream&gt;&quot; verfügbar ist ? Das &quot;#include &lt;iostream&gt;&quot; wurde ja erst geshriebven, nachdem es schon eingesetzt wurde.</p>
<p>3. Bei der #define-Direktive: die ist ja auch ein Präprozessor-Befehl.<br />
Wenn man nun schreibt:</p>
<p>#define C 10</p>
<p>int main()<br />
{<br />
cout &lt;&lt; C &lt;&lt; endl;<br />
cout &lt;&lt; A &lt;&lt; endl;<br />
}</p>
<p>#define A 15</p>
<p>Dann gibt es eine Fehlermeldung. Liegt es daran, dass der Präprozessor sozusagen das Programm von oben nach unten durchläuft und die Textersetzungen nur vornimmt, wenn ihm die Konstante (also A bzw. C) schon bekannt ist ?</p>
<p>Herzliche Grüße und Danke im Voraus</p>
<p>Monadic512</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097884</guid><dc:creator><![CDATA[Monadic512]]></dc:creator><pubDate>Tue, 26 Jul 2011 09:03:51 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Arbeit des Compilers on Tue, 26 Jul 2011 09:05:55 GMT]]></title><description><![CDATA[<p>Zu Frage 1</p>
<pre><code class="language-cpp">int a;
int b = 5;

class CPlayer
{
     // ....
}
</code></pre>
<p>Zu Frage 2</p>
<pre><code class="language-cpp">using namespace std;

int main()
{
cout &lt;&lt; &quot;xyz&quot; &lt;&lt; endl;
}

#include &lt;iostream&gt;
</code></pre>
<p>Zu Frage 3</p>
<pre><code class="language-cpp">#define C 10

int main()
{
cout &lt;&lt; C &lt;&lt; endl;
cout &lt;&lt; A &lt;&lt; endl;
}

#define A 15
</code></pre>
<p>Herzliche Grüße und Danke im Voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097888</guid><dc:creator><![CDATA[Monadic512]]></dc:creator><pubDate>Tue, 26 Jul 2011 09:05:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Arbeit des Compilers on Tue, 26 Jul 2011 09:16:38 GMT]]></title><description><![CDATA[<ol>
<li>Nur die Deklaration muss vor dem Einsatz bekannt sein. Aber der Linker muss die Definition eines eingesetzten Bezeichners sehen.</li>
<li>Ich weiss nicht wie das im Präprozessor-Inneren aussieht aber du kannst sicher sein, dass es einen Fehler hervorruft.</li>
<li>Richtig.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2097890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097890</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Tue, 26 Jul 2011 09:16:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Arbeit des Compilers on Tue, 26 Jul 2011 09:16:39 GMT]]></title><description><![CDATA[<p>1. Es gilt Variablen so lokal wie möglich zu deklarieren. Globale Variablen sind kein guter Programmierstil und bringen häufig schwer findbare Fehler mit sich.</p>
<p>2. Ja, du hast die Vorgehensweise des Präprozessors anscheinend gut verstanden. Denn genau deshalb funktioniert es nicht. Dabei ist es aber etwas zu allgemein gesagt, das der Präprozessor nur die Funktionen einfügt. Tatsächlich fügt er den gesamten Inhalt der Datei iostream ein. Du kannst auch selber eine separate Datei erstellen und mit #include in dein Programm einbinden. So kann man sein Programm gliedern. Die Klasse CPlayer könnte dann z.B. eine eigene Datei bekommen. In dem Fall solltest du dich noch nach Include-Guards umschauen.</p>
<p>3. Auch hier hast du das Problem richtig erkannt. Der Präprozessor kann nur Dinge ersetzen, die ihn zu diesem Zeitpunkt auch bekannt sind. Bei A ist das nicht der Fall, weshalb der Compiler A für eine Variable hält, die aber auch nicht deklariert ist. Das Programm kompiliert also nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097891</guid><dc:creator><![CDATA[hjkhjk]]></dc:creator><pubDate>Tue, 26 Jul 2011 09:16:39 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Arbeit des Compilers on Tue, 26 Jul 2011 09:21:09 GMT]]></title><description><![CDATA[<p>Monadic512 schrieb:</p>
<blockquote>
<p>Leider gibts einige Unsicherheiten, die auch nirgendwo erklärt sind:</p>
</blockquote>
<p>Lass uns sagen, deren Erklärung dur nirgendwo gefunden hast.</p>
<p>Monadic512 schrieb:</p>
<blockquote>
<p>1.Ist es richtig, dass alle Deklarationen von Variablen und Klassen schon vor dem Programmablauf dem Compiler bekannt gemacht werden ?</p>
</blockquote>
<p>Sowohl der Compiler als auch der Sourcecode hat mit dem eigentlichen Programmablauf und nicht direkt zu tun. Der Compiler liest den Sourcecode (inclusive der Variablendeklarationen) und generiert daraus Objektdateien. Der Linker generiert daraus die ausführbare Datei. Der Programmablauf startet, wenn du die ausführbare Datei ausführst. Das kann auf einem anderen Rechner und sehr viel später passieren, ist also ziemlich entkoppelt von Variablendeklarationen etc. (Die Namen der Variablen sind in den ausführbaren Dateien auch nicht mehr enthalten, falls es darum ging).</p>
<p>Monadic512 schrieb:</p>
<blockquote>
<p>2. Bei #include-Direktiven soll ja vom Präprozessor einfach der Code des entsprechneden Moduls an die Stelle der Direktive gesetzt werden.</p>
<p>Wenn man nun z.B. schreibt</p>
<p>using namespace std;</p>
<p>int main()<br />
{<br />
cout &lt;&lt; &quot;xyz&quot; &lt;&lt; endl;<br />
}</p>
<p>#include &lt;iostream&gt;</p>
<p>Dann funktioniert das Programm ja nicht. Aber es ist doch richtig, dass:<br />
1. Der Präprozessor durch das Programm läuft und mein #include &lt;iostream&gt; durch die entsprechenden Funktionen ersetzt<br />
2. Der Compiler das Programm kompiliert und dann nicht über den cout-Befehl verfügt, weil dieser erst unterhalb des &quot;#include &lt;iostream&gt;&quot; verfügbar ist ? Das &quot;#include &lt;iostream&gt;&quot; wurde ja erst geshriebven, nachdem es schon eingesetzt wurde.</p>
</blockquote>
<p>Richtig. In der main oben weiß der Compiler nicht, was mit cout gemeint ist. Du sagst es ihm erst hinterher, wenn er schon längst nicht mehr weiß, dass er da vorher drüber gestolpert ist.</p>
<blockquote>
<p>3. Bei der #define-Direktive: die ist ja auch ein Präprozessor-Befehl.<br />
Wenn man nun schreibt:</p>
<p>#define C 10</p>
<p>int main()<br />
{<br />
cout &lt;&lt; C &lt;&lt; endl;<br />
cout &lt;&lt; A &lt;&lt; endl;<br />
}</p>
<p>#define A 15</p>
<p>Dann gibt es eine Fehlermeldung. Liegt es daran, dass der Präprozessor sozusagen das Programm von oben nach unten durchläuft und die Textersetzungen nur vornimmt, wenn ihm die Konstante (also A bzw. C) schon bekannt ist ?</p>
</blockquote>
<p>Richtig. Nach dem PP steht in obigem Programm folgendes:</p>
<pre><code class="language-cpp">int main()
{
   cout &lt;&lt; 10 &lt;&lt; endl;
   cout &lt;&lt; A &lt;&lt; endl;
}
</code></pre>
<p>(Whitespaces hab ich der Übersicht wegen gelassen. Der PP schrumpft die auch alle zusammen.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097892</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 26 Jul 2011 09:21:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Arbeit des Compilers on Tue, 26 Jul 2011 10:38:45 GMT]]></title><description><![CDATA[<p>Monadic512 schrieb:</p>
<blockquote>
<p>Momentan beschäftige ich mich mit dem C++-Compiler und dem Präprozessor.<br />
Leider gibts einige Unsicherheiten, die auch nirgendwo erklärt sind</p>
</blockquote>
<p><a href="http://www.c-plusplus.net/forum/290061" rel="nofollow">http://www.c-plusplus.net/forum/290061</a> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097914</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Tue, 26 Jul 2011 10:38:45 GMT</pubDate></item></channel></rss>