<?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[Namespace an mehreren Stellen verwenden]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Im Moment beschäftige ich mich ein bisschen mit Namespaces, wie ich gelesen habe ein tolles Mittel um Variablen und Funktionen zu gruppieren. Leider bin ich hier auf einige Probleme gestoßen, für die ich keine Lösungen finde (möglicherweise bin ich auch nur zu dumm die richtigen Suchbegriffe in google einzugeben). (Ich benutze VS2008, nur für den Fall, dass das einen Unterschied machen könnte.)</p>
<p>Mein erstes Problem ist das anlegen des Namespace, mit Variablen und Funktionen auf die man von überall her zugreifen können soll:<br />
Zunächst habe ich die names.h in der ich meine namespaces sammeln will</p>
<pre><code>//names.h
namespace Func
{
	std::string filename = &quot;Ini&quot;;
		int add(int a, int b)
	{
		return a+b;
	}
}
</code></pre>
<p>Lege ich den Namespace Func so an bekomme ich einen Linkerfehler (<strong>error LNK2005: &quot;int __cdecl Func::add(int,int)&quot; (?add@Func@@YAHHH@Z) already defined in main.obj</strong>), sobald ich names.h an mehreren Stellen im Code includiere. Soblad ich aber den Namespace Func als Unter-Namespace zu einem unbenannten Namespace defniniere geht es:</p>
<pre><code>//names.h
namespace
{
	namespace Func
	{
		std::string filename = &quot;Ini&quot;;

		int add(int a, int b)
		{
			return a+b;
		}
	}
}
</code></pre>
<p>Ist das so gedacht, oder gibt es hierfür einen &quot;richtigen&quot; Weg um einen global zugreifbaren namespace zu erstellen?</p>
<p>Das zweite Problem ist, dass scheinbar pro Klasse in die ich die names.h inlcudiere eine eigene Instanz des namespace Func habe. Sprich mache ich in Klasse A eine Änderung an Func::filename könnte ich diese Änderung in Klasse B Func::filename nicht ablesen. Func::filename auf static zu setzen ändert leider auch nichts an diesem Verhalten.</p>
<p>Was mache ich da falsch? Beim Namespace <strong>std</strong> funktionieren solche Sachen ja auch ohne Probleme.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/288310/namespace-an-mehreren-stellen-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 01:26:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288310.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 14 Jun 2011 14:14:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Namespace an mehreren Stellen verwenden on Tue, 14 Jun 2011 14:14:48 GMT]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Im Moment beschäftige ich mich ein bisschen mit Namespaces, wie ich gelesen habe ein tolles Mittel um Variablen und Funktionen zu gruppieren. Leider bin ich hier auf einige Probleme gestoßen, für die ich keine Lösungen finde (möglicherweise bin ich auch nur zu dumm die richtigen Suchbegriffe in google einzugeben). (Ich benutze VS2008, nur für den Fall, dass das einen Unterschied machen könnte.)</p>
<p>Mein erstes Problem ist das anlegen des Namespace, mit Variablen und Funktionen auf die man von überall her zugreifen können soll:<br />
Zunächst habe ich die names.h in der ich meine namespaces sammeln will</p>
<pre><code>//names.h
namespace Func
{
	std::string filename = &quot;Ini&quot;;
		int add(int a, int b)
	{
		return a+b;
	}
}
</code></pre>
<p>Lege ich den Namespace Func so an bekomme ich einen Linkerfehler (<strong>error LNK2005: &quot;int __cdecl Func::add(int,int)&quot; (?add@Func@@YAHHH@Z) already defined in main.obj</strong>), sobald ich names.h an mehreren Stellen im Code includiere. Soblad ich aber den Namespace Func als Unter-Namespace zu einem unbenannten Namespace defniniere geht es:</p>
<pre><code>//names.h
namespace
{
	namespace Func
	{
		std::string filename = &quot;Ini&quot;;

		int add(int a, int b)
		{
			return a+b;
		}
	}
}
</code></pre>
<p>Ist das so gedacht, oder gibt es hierfür einen &quot;richtigen&quot; Weg um einen global zugreifbaren namespace zu erstellen?</p>
<p>Das zweite Problem ist, dass scheinbar pro Klasse in die ich die names.h inlcudiere eine eigene Instanz des namespace Func habe. Sprich mache ich in Klasse A eine Änderung an Func::filename könnte ich diese Änderung in Klasse B Func::filename nicht ablesen. Func::filename auf static zu setzen ändert leider auch nichts an diesem Verhalten.</p>
<p>Was mache ich da falsch? Beim Namespace <strong>std</strong> funktionieren solche Sachen ja auch ohne Probleme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2078028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2078028</guid><dc:creator><![CDATA[wulfgar]]></dc:creator><pubDate>Tue, 14 Jun 2011 14:14:48 GMT</pubDate></item><item><title><![CDATA[Reply to Namespace an mehreren Stellen verwenden on Tue, 14 Jun 2011 14:17:40 GMT]]></title><description><![CDATA[<p>Deine Probleme haben nichts mit Namespaces zu tun, du machst grundlegende Fehler mit Headern:<br />
1. Du hast keine Includeguards<br />
2. Du hast Definitionen von nicht-inline Funktionen und Variablen im Header.</p>
<p>Mit dem anonymen Namespace hast du nur die Symptome beseitigt, nicht das grundlegende Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2078031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2078031</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 14 Jun 2011 14:17:40 GMT</pubDate></item><item><title><![CDATA[Reply to Namespace an mehreren Stellen verwenden on Tue, 14 Jun 2011 14:35:21 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Deine Probleme haben nichts mit Namespaces zu tun, du machst grundlegende Fehler mit Headern:<br />
1. Du hast keine Includeguards</p>
</blockquote>
<p>Doch, hab ich. Hab sie nur der Übersichtlichkeit halber weg gelassen. Die ganze datei sieht so aus:</p>
<pre><code class="language-cpp">#ifndef CONF
#define CONF

#include &lt;string&gt;

namespace
{
	namespace Func
	{
		std::string filename = &quot;Ini&quot;;

		int add(int a, int b)
		{
			return a+b;
		}
	}
}
#endif
</code></pre>
<p>Ich hatte sie am Anfang nicht drin, aber sie rein zu machen hat leider nichts geändert (was der Hauptgrund war warum ich sie nicht mit rein genommen habe, weil es scheinbar am Ergebnis nichts geändert hat)</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>2. Du hast Definitionen von nicht-inline Funktionen und Variablen im Header.</p>
<p>Mit dem anonymen Namespace hast du nur die Symptome beseitigt, nicht das grundlegende Problem.</p>
</blockquote>
<p>Ok, da muss ich zugeben, dass ich nicht genau weiss was du damit meinst, bzw. inwiefern das zu Problemen führt. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2078044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2078044</guid><dc:creator><![CDATA[wulfgar]]></dc:creator><pubDate>Tue, 14 Jun 2011 14:35:21 GMT</pubDate></item><item><title><![CDATA[Reply to Namespace an mehreren Stellen verwenden on Tue, 14 Jun 2011 14:42:02 GMT]]></title><description><![CDATA[<p>Wenn du in jedem Modul eine Funktion add definierst, dann ist in jedem Modul eine Funktion add! Also genau das worüber sich dein Linker beschwert. Ebenso ist eine globale Variable filename in jedem Modul vorhanden. Woher soll der Linker nun wissen, welches die richtige ist?</p>
<p>Daher: In Header gehören nur Deklarationen (außer du machst alles inline, <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> aber mach das nicht ohne genau zu wissen, was das bedeutet und warum das funktioniert!). Also</p>
<pre><code class="language-cpp">extern std::string filename;
int add(int a, int b);
</code></pre>
<p>Und dann machst du noch eine cpp-Datei mit den tatsächlichen Definitionen dazu. Und das hat alles nichts mit Namespaces zu tun, sondern sind Grundlagen der Modularisierung von Programmen. Namespaces darfst du natürlich trotzdem gerne verwenden.</p>
<p>Außerdem solltest du noch überlegen, ob globale Variablen wirklich sinnvoll sind (in der Regel sind sie das nicht) und ob du wirklich eine Funktion zum Addieren von zwei Zahlen brauchst. Kleiner Tipp: Die gibt es schon in der Standardbibliothek und nennt sich + <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2078053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2078053</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 14 Jun 2011 14:42:02 GMT</pubDate></item><item><title><![CDATA[Reply to Namespace an mehreren Stellen verwenden on Tue, 14 Jun 2011 15:11:57 GMT]]></title><description><![CDATA[<p>Tja, langsam sollt ich sowas wissen. <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="😃"
    /> Ist ja nicht so als würde ich C++ erst seit gestern programmieren. Danke auf jeden Fall. Nü Funktioniert es.</p>
<p>Ja, globale Variable sind selten sinnvoll, da hast du schon recht. Nur habe ich gelesen, dass man auf diese Weise heutzutage Kostanten setzt (z.B. für festgelegte Farbdefinitionen, die überall gleich sein sollen). Meine Idee war auch das ganze als Träger einer beim Programmstart ausgelesenen Config zu machen, aber ich denke dafür nehm ich doch besser eine Klasse.</p>
<p>Das mit dem add war auch nur ein einfaches Beispiel. Bevor ich solche Sachen in richtigen Programmen benutze teste ich das gern in (für sich genommen) unsinnigen Testprogrammen. Normalerweise bin ich nicht so massochistisch veranlagt, dass ich die Addition zweier Ganzzahlen reimplementieren muss.</p>
<p>Vielen Dank auf jeden Fall für die Hilfe. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2078074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2078074</guid><dc:creator><![CDATA[wulfgar]]></dc:creator><pubDate>Tue, 14 Jun 2011 15:11:57 GMT</pubDate></item><item><title><![CDATA[Reply to Namespace an mehreren Stellen verwenden on Tue, 14 Jun 2011 15:29:01 GMT]]></title><description><![CDATA[<blockquote>
<p>Nur habe ich gelesen, dass man auf diese Weise heutzutage Kostanten setzt</p>
</blockquote>
<p>Definitiv nicht <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="🙂"
    /><br />
Man macht auch heut nur Dinge global, die frueher auch schon global waren.<br />
Also Dinge die nur einmalig im Programm vorkommen koennen Und wo das durchschleifen durch die Komplette Objecthirarchie die Funktions / Construktor Aufrufe zum Alptraum werden lassen.<br />
Nur dann !!!</p>
<p>Nen Makro ist immerhin auch sowas wie Global ! (falls du das meinst mit Konstanten ersetzen)</p>
<p>Und dann versteckt man die globalen Obkekte ganz gerne hinter einem Namensraum, richtig, aber meist zu der klasse, wo die syntaktisch hingehoeren.</p>
<p>Fuer deinen Fall, schau dir das Singleton Muster an. Glaub das ist sowas wie du suchst. Und ja am ende ists auch (ne gut versteckte) globale Variable.</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2078090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2078090</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Tue, 14 Jun 2011 15:29:01 GMT</pubDate></item><item><title><![CDATA[Reply to Namespace an mehreren Stellen verwenden on Tue, 14 Jun 2011 15:44:30 GMT]]></title><description><![CDATA[<p>Ok, ich schreibs mal ausführlicher:<br />
Am Anfang hab ich solche Konstanten (eigentlich egal ob lokal oder global) per #define gemacht. Dann allerdings habe ich ein Buch in die Finger bekommen, in dem stand, dass man sowas nicht machen sollte (Gründe weiss ich ehrlich gesagt nicht mehr, aber sie haben mich damals überzeugt <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="😉"
    /> ) und es statt dessen besser mit const Variablen macht. Und vor kurzem schließlich bin ich darüber gestolpert, dass man solche Konstanten in namespaces gruppieren sollte (der Übersicht halber).<br />
Es ging also nicht um die Frage &quot;Wann mach ich was global?&quot; sondern um &quot;Wie mache ich einen globalen Namespace, wenn ich mich schon dafür entschieden habe, dass die enthaltenen Daten global sein sollen?&quot;.</p>
<blockquote>
<p>Fuer deinen Fall, schau dir das Singleton Muster an. Glaub das ist sowas wie du suchst. Und ja am ende ists auch (ne gut versteckte) globale Variable.</p>
</blockquote>
<p>Äh, meinst du jetzt als träger globaler Konstanter oder als Träger der Config-Daten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2078095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2078095</guid><dc:creator><![CDATA[wulfgar]]></dc:creator><pubDate>Tue, 14 Jun 2011 15:44:30 GMT</pubDate></item></channel></rss>