<?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[Linken von statischen Variablen]]></title><description><![CDATA[<p>Hallo,<br />
mal angenommen ich habe einen Header in dem eine Klasse mit einer statischen variable deklariert wird und die Variable wird dort auch definiert:</p>
<p>A.h:</p>
<pre><code class="language-cpp">class A{
public: 
static int i;
}
int A::i;
</code></pre>
<p>Wenn ich jetzt zwei verschiedene Programmteile habe, die beide A::i verwenden, teil1.cpp und teil2.cpp und ich das Gesamtprojekt compiliere:</p>
<pre><code>cc teil1.cpp teil2.cpp
</code></pre>
<p>Dann bezeichnet A::i doch in beiden Teilen UNTERSCHIEDLICHE Speicherplätze, oder? Wenn ja, was kann man dagegen tun? Ich könnte die Definition von A::i natürlich nochmal in ein einzelnes Modul packen und das dem Linker geben, aber das kommt mir unnötig umständlich vor, für eine einzelne Variable. Ich habe mal was vom Schlüsselwort extern gehört, bin mir aber nicht sicher, ob das hier das richtige wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/247488/linken-von-statischen-variablen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 13:13:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247488.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Aug 2009 17:49:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Linken von statischen Variablen on Tue, 11 Aug 2009 17:49:36 GMT]]></title><description><![CDATA[<p>Hallo,<br />
mal angenommen ich habe einen Header in dem eine Klasse mit einer statischen variable deklariert wird und die Variable wird dort auch definiert:</p>
<p>A.h:</p>
<pre><code class="language-cpp">class A{
public: 
static int i;
}
int A::i;
</code></pre>
<p>Wenn ich jetzt zwei verschiedene Programmteile habe, die beide A::i verwenden, teil1.cpp und teil2.cpp und ich das Gesamtprojekt compiliere:</p>
<pre><code>cc teil1.cpp teil2.cpp
</code></pre>
<p>Dann bezeichnet A::i doch in beiden Teilen UNTERSCHIEDLICHE Speicherplätze, oder? Wenn ja, was kann man dagegen tun? Ich könnte die Definition von A::i natürlich nochmal in ein einzelnes Modul packen und das dem Linker geben, aber das kommt mir unnötig umständlich vor, für eine einzelne Variable. Ich habe mal was vom Schlüsselwort extern gehört, bin mir aber nicht sicher, ob das hier das richtige wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1759019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1759019</guid><dc:creator><![CDATA[Karl R]]></dc:creator><pubDate>Tue, 11 Aug 2009 17:49:36 GMT</pubDate></item><item><title><![CDATA[Reply to Linken von statischen Variablen on Tue, 11 Aug 2009 17:57:40 GMT]]></title><description><![CDATA[<p>Karl R schrieb:</p>
<blockquote>
<p>Ich könnte die Definition von A::i natürlich nochmal in ein einzelnes Modul packen und das dem Linker geben, aber das kommt mir unnötig umständlich vor, für eine einzelne Variable.</p>
</blockquote>
<p>Aber ist der normale Weg. Ausser du hast eine statisch konstante integrale Variable, dann braucht es keine Definition ausserhalb der Klasse.</p>
<p>Allerdings muss man mit solchen statischen Variablen extrem aufpassen, da man grob gesagt, eigentlich erst davon ausgehen kann, dass die Variable richtig vorhanden ist, wenn eine Funktion aus der entsprechenden Übersetzungseinheit aufgerufen wurde.</p>
<p>Um sich das Leben zu vereinfachen, kann man das ganze in eine Funktion packen:</p>
<pre><code class="language-cpp">class MyClass
{
public:
  static int&amp; myVar() { static int i = 0; return i; }
};
</code></pre>
<p>Die statische Variable wird ganz sicher vorhanden sein, wenn man zum ersten Mal die Funktion aufruft. Auch kann man alles in den Header schreiben. Bei der Verwendung sehen die Klammern vielleicht nicht ganz optimal aus, aber wirklich stören tun sie wohl nicht.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1759028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1759028</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 11 Aug 2009 17:57:40 GMT</pubDate></item><item><title><![CDATA[Reply to Linken von statischen Variablen on Tue, 11 Aug 2009 18:26:04 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Um sich das Leben zu vereinfachen, kann man das ganze in eine Funktion packen:</p>
<pre><code class="language-cpp">class MyClass
{
public:
  static int&amp; myVar() { static int i = 0; return i; }
};
</code></pre>
</blockquote>
<p>Hey, das ist toll. So fallen bei meinem Projekt eine Menge Schwierigkeiten weg. Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1759041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1759041</guid><dc:creator><![CDATA[Karl R]]></dc:creator><pubDate>Tue, 11 Aug 2009 18:26:04 GMT</pubDate></item><item><title><![CDATA[Reply to Linken von statischen Variablen on Tue, 11 Aug 2009 20:09:07 GMT]]></title><description><![CDATA[<p>Oft spricht auch nichts dagegen, eine Variable gar nicht in der Klasse, sondern global in der jeweiligen Übersetzungseinheit zu speichern. Das hat den Vorteil, dass du dir gewisse Abhängigkeiten sparst und damit bei Änderungen weniger neu kompilieren musst. Hängt natürlich auch von dem jeweiligen Fall ab. Mich würde trotzdem interessieren, wieso bei dir eine Definition in der Übersetzungseinheit einen solchen Mehraufwand mit sich bringen soll.</p>
<p>Siehe auch <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-237943.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-237943.html</a>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1759085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1759085</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 11 Aug 2009 20:09:07 GMT</pubDate></item><item><title><![CDATA[Reply to Linken von statischen Variablen on Tue, 11 Aug 2009 20:27:18 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Mich würde trotzdem interessieren, wieso bei dir eine Definition in der Übersetzungseinheit einen solchen Mehraufwand mit sich bringen soll.</p>
</blockquote>
<p>Das liegt daran, dass besagte Klasse nur so kurze Methoden hat, dass ich für sie gar keine Übersetzungseinheit eigene habe, sondern alles inline gemacht habe. Ich würde also quasi eine neue Übersetzungseinheit mit nur zwei Zeilen, nämlich</p>
<p>A.cpp:</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;
int A::i;
</code></pre>
<p>machen. Das ist natürlich nicht viel Aufwand, sondern ich fand eher, dass es irgendwie lächerlich aussieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1759091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1759091</guid><dc:creator><![CDATA[Karl R]]></dc:creator><pubDate>Tue, 11 Aug 2009 20:27:18 GMT</pubDate></item><item><title><![CDATA[Reply to Linken von statischen Variablen on Tue, 11 Aug 2009 20:32:56 GMT]]></title><description><![CDATA[<p>Ah okay. Um die Klasse klein zu halten, kannst du das schon so machen. Solange du die Funktionen selten änderst, wenige Dateien von deinem Header abhängig sind oder deine Kompilierzeiten sowieso kurz sind, ist das auch gar kein Problem.</p>
<p>Ich selber habe mir angewöhnt, die meisten Funktionen in der .cpp-Datei zu definieren. Bei ganz kleinen Klassen sind dann teilweise mehrere Klassen in einem Header und entsprechend mehrere Funktionsdefinitionen in der Implementierungsdatei. Falls man Templates verwendet, ist das sowieso wieder was anderes...</p>
<p>Das Ganze ist wie so vieles auch ein wenig Geschmackssache. Ich habe es zum Beispiel lieber, wenn ich in der Headerdatei gerade einen schönen Überblick über die Deklarationen habe und nicht unnötige Implementierungsdetails sehe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1759094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1759094</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 11 Aug 2009 20:32:56 GMT</pubDate></item></channel></rss>