<?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 zu Namespace und Mehrdeutigkeiten]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes in mehreren cpp-Dateien stehen:</p>
<pre><code class="language-cpp">namespace constValues
{
	const double startBurnerLength = 140.0;

        ....

	const TCHAR* burnerPath = _T(&quot;IDB_BRENNER&quot;);	
}
</code></pre>
<p>Wenn ich das so mache in mehreren cpp-Dateien, dann bekomme ich einen Compile-Fehler bei burnerPath (Mehrdeutigkeit). Die &quot;Zahl-Variablen&quot; gehen aber komischerweise durch. Woran liegt das?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/195270/frage-zu-namespace-und-mehrdeutigkeiten</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 21:55:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/195270.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Oct 2007 07:56:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Namespace und Mehrdeutigkeiten on Tue, 16 Oct 2007 07:56:23 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes in mehreren cpp-Dateien stehen:</p>
<pre><code class="language-cpp">namespace constValues
{
	const double startBurnerLength = 140.0;

        ....

	const TCHAR* burnerPath = _T(&quot;IDB_BRENNER&quot;);	
}
</code></pre>
<p>Wenn ich das so mache in mehreren cpp-Dateien, dann bekomme ich einen Compile-Fehler bei burnerPath (Mehrdeutigkeit). Die &quot;Zahl-Variablen&quot; gehen aber komischerweise durch. Woran liegt das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386111</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Tue, 16 Oct 2007 07:56:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Namespace und Mehrdeutigkeiten on Tue, 16 Oct 2007 08:51:22 GMT]]></title><description><![CDATA[<p>Pellaeon schrieb:</p>
<blockquote>
<p>...bekomme ich einen Compile-Fehler ...</p>
</blockquote>
<p>Welchen denn ?<br />
Compilefehler halte ich auch eher für unwahrscheinlich (zumindestens, wenn er Mehrdeutigkeiten betrifft), da (vernünftiges Design vorausgesetzt) der Compiler jede cpp-Datei separat betrachtet.<br />
Linkerfehler dagegen könnte ich mir schon eher vorstellen....</p>
<p>Frage: Nutzt Du startBurnerLength wirklich irgendwo ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386147</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 16 Oct 2007 08:51:22 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Namespace und Mehrdeutigkeiten on Tue, 16 Oct 2007 08:56:42 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Pellaeon schrieb:</p>
<blockquote>
<p>...bekomme ich einen Compile-Fehler ...</p>
</blockquote>
<p>Welchen denn ?<br />
Compilefehler halte ich auch eher für unwahrscheinlich (zumindestens, wenn er Mehrdeutigkeiten betrifft), da (vernünftiges Design vorausgesetzt) der Compiler jede cpp-Datei separat betrachtet.<br />
Linkerfehler dagegen könnte ich mir schon eher vorstellen....</p>
<p>Frage: Nutzt Du startBurnerLength wirklich irgendwo ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
<p>hm peinlich, natürlich ein Linker-Fehler^^<br />
Ja die Konstanten nutze ich. Ich packe sie halt gerne in einen Namespace, weil ich dann später im Quellcode sofort sehe, wenn eine Variable eine Konstante ist.<br />
Den Fehler krieg ich weg, wenn ich den Text static mache. Mich interessiert halt einfach, warum die doubles keine Mehrdeutigkeit verursachen, die Texte aber schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386150</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Tue, 16 Oct 2007 08:56:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Namespace und Mehrdeutigkeiten on Tue, 16 Oct 2007 10:52:00 GMT]]></title><description><![CDATA[<p>Mal eine kleine Vorabinfo (falls Du das schon wusstest - einfach ignorieren):<br />
namespaces gelten über Modulebene hinweg. D.h. Du packst wirklich alles in denselben namespace und das führt zu den Kollisionen.</p>
<p>Ich vermute, dass der Compiler den double (als primitiven Typen) im cpp direkt ersetzt, während burnerPath tatsächlich als adressierbares Objekt stehen bleibt.<br />
(allerdings hieße das, dass es als Symbol auch anderen Modulen nicht zur Verfügung stände und das würde mir derzeit nicht einleuchten).....<br />
hmmm, muss ich mal nachblättern.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386252</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 16 Oct 2007 10:52:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Namespace und Mehrdeutigkeiten on Tue, 16 Oct 2007 12:34:02 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Ich vermute, dass der Compiler den double (als primitiven Typen) im cpp direkt ersetzt, während burnerPath tatsächlich als adressierbares Objekt stehen bleibt.<br />
(allerdings hieße das, dass es als Symbol auch anderen Modulen nicht zur Verfügung stände und das würde mir derzeit nicht einleuchten).....</p>
</blockquote>
<p>Bei burnerPath ist es eindeutig - ODR verletzt, da in jedem Modul, welches diesen Namespace inkludiert, ein constValues::burnerPath definiert wird. Lösung: (Extern-)Deklaration im Header und Definition in <strong>einem</strong> Sourcefile.</p>
<p>startBurnerLength ist mir bislang noch ein Rätsel, da ich zwar wusste dass Konstanten auf Namespaceebene in C++ &quot;echte&quot; Konstanten sind, sofern dem Compiler der Wert bekannt ist, aber annahm, dies träfe nur auf Integrale (keine Fließkommatypen) zu. Bei den Integralen ist es zudem so, dass der Linker erst dann ein Symbol dafür benötigt, wenn der Wert dem Compiler nicht bekannt ist (z.B. weil die Variable wie oben angedeutet extern deklariert und in einem File definiert wurde) oder wenn jemand die Adresse der Variable zu nehmen versucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386333</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 16 Oct 2007 12:34:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Namespace und Mehrdeutigkeiten on Tue, 16 Oct 2007 13:06:34 GMT]]></title><description><![CDATA[<p>Bei der double-Konstanten scheint es so zu sein, daß diese entweder gar nicht verwendet wird oder aber der Compiler den Wert dafür inline ersetzt. Nur wenn die Adresse dafür benötigt wird, erzeugt der Compiler daraus eine externe Variable (für den Linker).</p>
<p>Pellaeon:<br />
Wenn du wirklich unterschiedliche Konstanten je Übersetzungseinheit haben willst, dann solltest du einfach anonyme Namespaces verwenden (der Zugriff darauf ist dann auch einfacher, da du nicht immer den Namespace-Namen voranschreiben mußt). Wenn du aber dieselben Konstanten für die ÜEs haben willst, dann schreibe sie in einen Header und definiere sie genau 1 mal (wie LordJaxom geschrieben hat).</p>
<p>P.S. Wenn 'burnerPath' selber eine Konstante sein soll, dann mußt du noch ein 'const' hinzufügen:</p>
<pre><code class="language-cpp">const TCHAR* const burnerPath = _T(&quot;IDB_BRENNER&quot;);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1386379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386379</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 16 Oct 2007 13:06:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Namespace und Mehrdeutigkeiten on Tue, 16 Oct 2007 13:27:52 GMT]]></title><description><![CDATA[<p>Namespaceobjekte, die const sind, haben implizit internal linkage (also so, als ob sie mit static deklariert wurden), es sei denn, sie werden explizit mit extern deklariert. Das macht es erst möglich, #define durch const zu ersetzen. Aus diesem Grunde ist</p>
<pre><code class="language-cpp">const double startBurnerLength = 140.0;
</code></pre>
<p>keine Verletzung der ODR, wenn das in mehreren Übersetzungseinheiten auftritt. Umgekehrt, ist</p>
<pre><code class="language-cpp">const TCHAR* burnerPath = _T(&quot;IDB_BRENNER&quot;);
</code></pre>
<p>keine Definition einer Konstanten (und das hat nichts mit konstanten Ausdrücken zu tun), solche Variablen sind standardmäßig extern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386396</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 16 Oct 2007 13:27:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Namespace und Mehrdeutigkeiten on Tue, 16 Oct 2007 15:35:36 GMT]]></title><description><![CDATA[<p>Ok, danke für eure Hilfe!</p>
<p>MfG Pellaeon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386511</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Tue, 16 Oct 2007 15:35:36 GMT</pubDate></item></channel></rss>