<?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[Fehler in 3-zeiligem Programm, Problem bei Bezeichnerwahl]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich bin gerade dabei mit Bezeichnern zu experimentieren und kann mir nicht erklären wo in folgendem C++-Code der Fehler liegt:</p>
<pre><code class="language-cpp">// x.cpp

struct x;

x f(x x, x y); // ?

int main(){}
</code></pre>
<p>Überaschenderweise lässt sich dieser Code kompilieren:</p>
<pre><code class="language-cpp">// x.cpp

struct x;

x f(x y, x x); // ?

int main(){}
</code></pre>
<p>Fehlermeldung des g++:<br />
<code>x.cpp:5:10: Fehler: »x« ist kein Typ</code></p>
<p>Hat der zweite Parameter wiederum einen anderen Typ funktioniert alles:</p>
<pre><code class="language-cpp">// x.cpp

struct x;

x f(x x, int y); // ?

int main(){}
</code></pre>
<p>Ich habe den Code auch noch mal in C geschrieben. Hier das gleiche Problem. Folgender Code führt zum Fehler:</p>
<pre><code class="language-cpp">// x.c

typedef struct x x;

x f(x x, x y); // ?

int main(){}
</code></pre>
<p>Dieser nicht:</p>
<pre><code class="language-cpp">// x.c

typedef struct x x;

x f(x y, x x); // ?

int main(){}
</code></pre>
<p>Fehlermeldung des gcc:<br />
<code>x.c:5:10: Fehler: expected declaration specifiers or »...« before »x«</code></p>
<p>Ich habe alles Mögliche ausprobiert. Wenn ich die Funktion mit drei Parametern deklariere funktioniert die Compilierung nur wenn der letzte Parameter den gleichen Bezeichner hat wie der Typ...</p>
<p>Die Option <code>-Wall</code> ergibt weder bei erfolgreicher noch bein fehlgeschlagener Compilierung weitere Ausgaben. Gleiches gilt für <code>-std=c99</code> beim gcc.</p>
<p>Die Versionen der Compiler:<br />
<code>g++ -v</code> und <code>gcc -v</code> liefern beide:<br />
<code>gcc-Version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5</code></p>
<p>Mir ist natürlich klar, dass man verschiedene Bezeichner für Typen und Variablen wählen sollte. Ich möchte bloß das Prinzip verstehen nach dem ich Bezeichner wählen kann.</p>
<p>Ich hoffe mir kann jemand sagen was der Fehler ist oder ob der g++/gcc hier einfach vom Standard abweicht (was wirklich tragisch wäre :P).</p>
<p>MfG Tobi.</p>
<p><em>Edit: Titel unmittelbar geändert</em></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306846/fehler-in-3-zeiligem-programm-problem-bei-bezeichnerwahl</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 04:39:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306846.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 08 Aug 2012 20:06:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehler in 3-zeiligem Programm, Problem bei Bezeichnerwahl on Wed, 08 Aug 2012 20:08:07 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich bin gerade dabei mit Bezeichnern zu experimentieren und kann mir nicht erklären wo in folgendem C++-Code der Fehler liegt:</p>
<pre><code class="language-cpp">// x.cpp

struct x;

x f(x x, x y); // ?

int main(){}
</code></pre>
<p>Überaschenderweise lässt sich dieser Code kompilieren:</p>
<pre><code class="language-cpp">// x.cpp

struct x;

x f(x y, x x); // ?

int main(){}
</code></pre>
<p>Fehlermeldung des g++:<br />
<code>x.cpp:5:10: Fehler: »x« ist kein Typ</code></p>
<p>Hat der zweite Parameter wiederum einen anderen Typ funktioniert alles:</p>
<pre><code class="language-cpp">// x.cpp

struct x;

x f(x x, int y); // ?

int main(){}
</code></pre>
<p>Ich habe den Code auch noch mal in C geschrieben. Hier das gleiche Problem. Folgender Code führt zum Fehler:</p>
<pre><code class="language-cpp">// x.c

typedef struct x x;

x f(x x, x y); // ?

int main(){}
</code></pre>
<p>Dieser nicht:</p>
<pre><code class="language-cpp">// x.c

typedef struct x x;

x f(x y, x x); // ?

int main(){}
</code></pre>
<p>Fehlermeldung des gcc:<br />
<code>x.c:5:10: Fehler: expected declaration specifiers or »...« before »x«</code></p>
<p>Ich habe alles Mögliche ausprobiert. Wenn ich die Funktion mit drei Parametern deklariere funktioniert die Compilierung nur wenn der letzte Parameter den gleichen Bezeichner hat wie der Typ...</p>
<p>Die Option <code>-Wall</code> ergibt weder bei erfolgreicher noch bein fehlgeschlagener Compilierung weitere Ausgaben. Gleiches gilt für <code>-std=c99</code> beim gcc.</p>
<p>Die Versionen der Compiler:<br />
<code>g++ -v</code> und <code>gcc -v</code> liefern beide:<br />
<code>gcc-Version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5</code></p>
<p>Mir ist natürlich klar, dass man verschiedene Bezeichner für Typen und Variablen wählen sollte. Ich möchte bloß das Prinzip verstehen nach dem ich Bezeichner wählen kann.</p>
<p>Ich hoffe mir kann jemand sagen was der Fehler ist oder ob der g++/gcc hier einfach vom Standard abweicht (was wirklich tragisch wäre :P).</p>
<p>MfG Tobi.</p>
<p><em>Edit: Titel unmittelbar geändert</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240235</guid><dc:creator><![CDATA[Tobi.]]></dc:creator><pubDate>Wed, 08 Aug 2012 20:08:07 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in 3-zeiligem Programm, Problem bei Bezeichnerwahl on Wed, 08 Aug 2012 20:20:43 GMT]]></title><description><![CDATA[<p>In dem Moment, wo du &quot;x x&quot; deklarierst, überdeckt die lokale Variable x&quot; den Typ &quot;x&quot;.</p>
<p>Wie wärs mit Aussagekräftigen namen? Oder namenskonventionen, die sowas verhindern?</p>
<pre><code class="language-cpp">struct X;
foo(X x, X y);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2240239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240239</guid><dc:creator><![CDATA[someone.]]></dc:creator><pubDate>Wed, 08 Aug 2012 20:20:43 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in 3-zeiligem Programm, Problem bei Bezeichnerwahl on Wed, 08 Aug 2012 20:23:28 GMT]]></title><description><![CDATA[<p>Noch mehr Ad-Hoc-Lösungen:</p>
<pre><code class="language-cpp">x f(x x, ::x y);
</code></pre>
<pre><code class="language-cpp">x f(x x, decltype(x) y);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2240240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240240</guid><dc:creator><![CDATA[yetanotheruser]]></dc:creator><pubDate>Wed, 08 Aug 2012 20:23:28 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in 3-zeiligem Programm, Problem bei Bezeichnerwahl on Wed, 08 Aug 2012 20:34:09 GMT]]></title><description><![CDATA[<p>Ach so ist das.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich dachte der Compiler interpretiert beim zweiten Parameter das erste Wort als Typ und das Zweite als Variablenbezeichner. Aber das erklärt natürlich das Problem. In C++ funktioniert auch die Lösung mit dem universellen Namespace.</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240247</guid><dc:creator><![CDATA[Tobi.]]></dc:creator><pubDate>Wed, 08 Aug 2012 20:34:09 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in 3-zeiligem Programm, Problem bei Bezeichnerwahl on Wed, 08 Aug 2012 20:58:28 GMT]]></title><description><![CDATA[<p>Ich denke folgende Frage hat noch etwas mit dem Thread zu tun, also hänge ich sie mal an.</p>
<p>Jetzt frage ich mich was es dann für einen Sinn macht Typen und Variablen gleiche Namen geben zu können wenn der Compiler nicht merkt dass an einer Stelle beispielsweise ein Typ benötigt wird und entsprechend einen Typ mit dem angegebenen Bezeichner sucht (so wie ich es mir beim Beispiel oben erst vorgestellt habe).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240258</guid><dc:creator><![CDATA[Tobi.]]></dc:creator><pubDate>Wed, 08 Aug 2012 20:58:28 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in 3-zeiligem Programm, Problem bei Bezeichnerwahl on Wed, 08 Aug 2012 21:04:38 GMT]]></title><description><![CDATA[<p>Tobi. schrieb:</p>
<blockquote>
<p>Jetzt frage ich mich was es dann für einen Sinn macht Typen und Variablen gleiche Namen geben zu können wenn der Compiler nicht merkt dass an einer Stelle beispielsweise ein Typ benötigt wird und entsprechend einen Typ mit dem angegebenen Bezeichner sucht (so wie ich es mir beim Beispiel oben erst vorgestellt habe).</p>
</blockquote>
<p>Weil's doof ist, wenn jemand irgendwo im Projekt einen neuen Typ einführt, der zufällig so heißt wie eine deiner Variablen und plötzlich funktioniert dein Code nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240259</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 08 Aug 2012 21:04:38 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in 3-zeiligem Programm, Problem bei Bezeichnerwahl on Wed, 08 Aug 2012 21:26:15 GMT]]></title><description><![CDATA[<p>Tobi. schrieb:</p>
<blockquote>
<p>In C++ funktioniert auch die Lösung mit dem universellen Namespace.</p>
</blockquote>
<p>Universeller Namespace...? Das ist der <em>globale</em> Namespace <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>
<blockquote>
<p>Jetzt frage ich mich was es dann für einen Sinn macht Typen und Variablen gleiche Namen geben zu können wenn der Compiler nicht merkt dass an einer Stelle beispielsweise ein Typ benötigt wird und entsprechend einen Typ mit dem angegebenen Bezeichner sucht (so wie ich es mir beim Beispiel oben erst vorgestellt habe).</p>
</blockquote>
<p>N3337 Paragraph 9.1 Klausel 2 schrieb:</p>
<blockquote>
<p>If a class name is declared in a scope<br />
where a variable, function, or enumerator of the same name is also declared, then when both declarations<br />
are in scope, the class can be referred to only using an elaborated-type-specifier:...</p>
</blockquote>
<p>Und weil es gerade um elaborate-type-specifiers geht:</p>
<blockquote>
<pre><code class="language-cpp">x f(x x, decltype(x) y);
</code></pre>
</blockquote>
<p>Fail? Wieso nicht einfach ein elaborate-type-specifier?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240265</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 08 Aug 2012 21:26:15 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in 3-zeiligem Programm, Problem bei Bezeichnerwahl on Wed, 08 Aug 2012 22:47:59 GMT]]></title><description><![CDATA[<p>Tobi. schrieb:</p>
<blockquote>
<p>Jetzt frage ich mich was es dann für einen Sinn macht Typen und Variablen gleiche Namen geben zu können wenn der Compiler nicht merkt dass an einer Stelle beispielsweise ein Typ benötigt wird und entsprechend einen Typ mit dem angegebenen Bezeichner sucht (so wie ich es mir beim Beispiel oben erst vorgestellt habe).</p>
</blockquote>
<p>Da Typen und Objekte verschiedene Dinge repräsentieren, und der Bezeichner sich auf diese Repräsentationen beziehen sollte, sollte sich diese Frage eigentlich gar nicht stellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240270</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 08 Aug 2012 22:47:59 GMT</pubDate></item></channel></rss>