<?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[static const in Headern?]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>da meine C++ Kenntnisse wohl noch nicht mal Anfängerstand erreicht haben, habe ich mir ein paar Bücher zugelegt, um dort nachzuschlagen.</p>
<p>Nun habe ich folgendes Problem. Ich möchte eine globale Konstante vom Typ einer Struktur deklarieren und definieren.</p>
<p>Die mache ich in einem .cc File, da ich gelesen habe, dass man globale Variablen mit externem Linking nur einmal anlegen darf. Als ich sie in einem .h File anlegte, dass mit #ifdef vor doppeltem Gebrauch geschützt ist hat der Linker des g++ trotzdem gemeckert.</p>
<p>Also hab ich mir eine Datei <a href="http://Globals.cc" rel="nofollow">Globals.cc</a> gemacht, in diese habe ich dann folgendes geschrieben:</p>
<pre><code>static const struct TagItem tagEnd = {TAG_DONE, 0L};
</code></pre>
<p>Es handelt sich hier um eine Struktur und definierte Typen des unterliegenden Betriebssystems.</p>
<p>Nun möchte ich diese Konstante in einem .h File verwenden, zu dem es kein .cc File gibt, da alles inline ist.</p>
<p>Das .h File und das File <a href="http://Globals.cc" rel="nofollow">Globals.cc</a> liegen im selben Verzeichnis. Für das File <a href="http://Globals.cc" rel="nofollow">Globals.cc</a> ist ein entsprechender Eintrag im makefile gemacht worden.</p>
<p>Wenn ich nun im private Bereich des .h Files folgendes schreibe:</p>
<pre><code>extern struct TagItem tagEnd;
</code></pre>
<p>meckert der Linker, dass ich hier einen Speicherbereich oder so für die Variable angebe.</p>
<p>Wie kann ich denn nun globale statische Konstanten in C++ anlegen und in Headern verwenden?</p>
<p>Vielen Dank schon einmal<br />
Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/126856/static-const-in-headern</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 04:14:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/126856.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 19 Nov 2005 11:25:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static const in Headern? on Sat, 19 Nov 2005 11:25:17 GMT]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>da meine C++ Kenntnisse wohl noch nicht mal Anfängerstand erreicht haben, habe ich mir ein paar Bücher zugelegt, um dort nachzuschlagen.</p>
<p>Nun habe ich folgendes Problem. Ich möchte eine globale Konstante vom Typ einer Struktur deklarieren und definieren.</p>
<p>Die mache ich in einem .cc File, da ich gelesen habe, dass man globale Variablen mit externem Linking nur einmal anlegen darf. Als ich sie in einem .h File anlegte, dass mit #ifdef vor doppeltem Gebrauch geschützt ist hat der Linker des g++ trotzdem gemeckert.</p>
<p>Also hab ich mir eine Datei <a href="http://Globals.cc" rel="nofollow">Globals.cc</a> gemacht, in diese habe ich dann folgendes geschrieben:</p>
<pre><code>static const struct TagItem tagEnd = {TAG_DONE, 0L};
</code></pre>
<p>Es handelt sich hier um eine Struktur und definierte Typen des unterliegenden Betriebssystems.</p>
<p>Nun möchte ich diese Konstante in einem .h File verwenden, zu dem es kein .cc File gibt, da alles inline ist.</p>
<p>Das .h File und das File <a href="http://Globals.cc" rel="nofollow">Globals.cc</a> liegen im selben Verzeichnis. Für das File <a href="http://Globals.cc" rel="nofollow">Globals.cc</a> ist ein entsprechender Eintrag im makefile gemacht worden.</p>
<p>Wenn ich nun im private Bereich des .h Files folgendes schreibe:</p>
<pre><code>extern struct TagItem tagEnd;
</code></pre>
<p>meckert der Linker, dass ich hier einen Speicherbereich oder so für die Variable angebe.</p>
<p>Wie kann ich denn nun globale statische Konstanten in C++ anlegen und in Headern verwenden?</p>
<p>Vielen Dank schon einmal<br />
Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/921248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/921248</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Sat, 19 Nov 2005 11:25:17 GMT</pubDate></item><item><title><![CDATA[Reply to static const in Headern? on Sat, 19 Nov 2005 11:54:04 GMT]]></title><description><![CDATA[<p>Warum static?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/921282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/921282</guid><dc:creator><![CDATA[Helium]]></dc:creator><pubDate>Sat, 19 Nov 2005 11:54:04 GMT</pubDate></item><item><title><![CDATA[Reply to static const in Headern? on Sat, 19 Nov 2005 12:11:18 GMT]]></title><description><![CDATA[<p>Reth schrieb:</p>
<blockquote>
<p>Nun habe ich folgendes Problem. Ich möchte eine globale Konstante vom Typ einer Struktur deklarieren und definieren.<br />
Die mache ich in einem .cc File, da ich gelesen habe, dass man globale Variablen mit externem Linking nur einmal anlegen darf.</p>
</blockquote>
<p>Das ist korrekt. Bzw. korrekt ist, dass man diese nur einmal _definieren_ darf (Btw: Es heißt &quot;Linkage&quot;)</p>
<blockquote>
<p>Als ich sie in einem .h File anlegte, dass mit #ifdef vor doppeltem Gebrauch geschützt ist hat der Linker des g++ trotzdem gemeckert.</p>
</blockquote>
<p>Mit diesen include-Guards verhinderst du nur, dass das entsprechende .h File nicht innerhalb _einer_ Übersetzungseinheit doppelt eingebunden wird! D.h. wenn du bsp. den Header header.hpp in deine Module foo.cpp und bar.cpp inkludierst, wird er sowohl in dem Objektcode von foo als auch in dem Objektcode von bar auftauchen. (Da kann sich der Linker schon mal beschweren :))</p>
<blockquote>
<p>Also hab ich mir eine Datei <a href="http://Globals.cc" rel="nofollow">Globals.cc</a> gemacht, in diese habe ich dann folgendes geschrieben:</p>
<pre><code>static const struct TagItem tagEnd = {TAG_DONE, 0L};
</code></pre>
<p>Es handelt sich hier um eine Struktur und definierte Typen des unterliegenden Betriebssystems.</p>
</blockquote>
<p>Jetzt hast du deine Struktur aber static deklariert. =&gt; Du kannst diese nur innerhalb dieser Datei ansprechen. Daraus resultieren die folgenden Fehler.</p>
<blockquote>
<p>Wie kann ich denn nun globale statische Konstanten in C++ anlegen und in Headern verwenden?</p>
</blockquote>
<p>Wenn du eine globale statische Variable anlegst, hat dieser interne Linkage. D.h. du kannst sie nur innerhalb der definierten ÜE benutzen. Du willst deine static-Variable aber nicht innerhalb der ÜE benutzen, in der sie definiert ist, sondern in einem Header, der von einem anderen Modul inkludiert wird. =&gt; Interne Linkage ist hier das Falsche... (Wenn ich dich korrekt verstanden habe)</p>
<p>Wenn du also eine Variable in einem Modul _definieren_, und in einem Header, der in ein anderes Modul eingebunden wird, verwenden willst, kannst du dies z.B. so bewerkstelligen:</p>
<p>Im Beispiel benutze ich den Header header.hpp und die Module definition.cpp (Hier wird die entsprechende Variable definiert) und main.cpp (Hier wird der Header header.hpp, der die Variable aus definition.cpp verwenden soll, inkludiert).</p>
<pre><code class="language-cpp">// definition.cpp - Definition von tagEnd.
const TagItem tagEnd = {TAG_DONE, 0L}; // TagItem muss hier natürlich bekannt sein...

// header.hpp
extern const TagItem tagEnd; // extern-Deklaration.

// in diesem Header kannst du tagEnd benutzen...

// main.cpp
#include &quot;header.hpp&quot;
// hier kannst du tagEnd ebenfalls benutzen...

int main() { }
</code></pre>
<p>Gruß Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/921309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/921309</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Sat, 19 Nov 2005 12:11:18 GMT</pubDate></item><item><title><![CDATA[Reply to static const in Headern? on Sat, 19 Nov 2005 15:53:47 GMT]]></title><description><![CDATA[<p>Vielen Dank Caipi!</p>
<p>Das hat mein Verständnis der Materie etwas verbessert.</p>
<p>Als ich in den Büchern gelesen habe, dass für statische Variablen nur einmal Speicher reserviert wird, wollte ich die Konstante global und statisch machen, da sie nur einmal im Speicher zu liegen braucht, auch wenn mehrere Einheiten sie verwenden.</p>
<p>Wenn ich Dich recht verstanden habe, dann geht sowas gar nicht!?</p>
<p>Ausser ich deklariere sie in Globals.h und definiere sie in Globals.cpp.<br />
Danach kann ich sie mit Globals::tagEnd doch irgendwie in nem anderen Header verwenden, wenn ich dort Globals.h inkludiere, oder?</p>
<p>Ciao<br />
Reth</p>
]]></description><link>https://www.c-plusplus.net/forum/post/921483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/921483</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Sat, 19 Nov 2005 15:53:47 GMT</pubDate></item><item><title><![CDATA[Reply to static const in Headern? on Sun, 20 Nov 2005 13:10:02 GMT]]></title><description><![CDATA[<p>Reth schrieb:</p>
<blockquote>
<p>Als ich in den Büchern gelesen habe, dass für statische Variablen nur einmal Speicher reserviert wird, wollte ich die Konstante global und statisch machen, da sie nur einmal im Speicher zu liegen braucht, auch wenn mehrere Einheiten sie verwenden.</p>
</blockquote>
<p>Das ist nicht ganz korrekt. Korrekt ist, dass innerhalb einer Übersetzungseinheit nur einmal Speicher für eine als static deklarierte Variable reserviert wird.<br />
Für globale nicht-statische Objekte bzw. Variablen wird innerhalb des gesamten Programms (d.h. innerhalb aller ÜEs) nur einmal Speicher reserviert - nämlich zum Zeitpunkt der _Definition_ der selbigen. (Andernfalls beschwert sich der Linker).<br />
Ein weiterer Unterschied zwischen globalen als static deklarierten Objekten und globalen _nicht_ als static deklarierten Objekten, der mit obigen Gegebenheiten zusammenhängt, ist das Linkage. D.h. ob und wie sie mit anderen Übersetzungseinheiten verbunden werden.<br />
Merke:<br />
1.) Globale als static deklarierte Bezeichner haben internes Linkage, d.h., dass sie außerhalb der ÜE, in der sie definiert wurden, nicht ansprechbar sind.<br />
2.) Globale _nicht_ als static deklarierte Bezeichner haben externes Linkage, d.h., dass sie von jeder ÜE angesprochen werden können.</p>
<p>Beispiel zu 1:<br />
(mit den Übersetzungseinheiten (Modulen) foo.cpp, bar.cpp und dem Header header.hpp)</p>
<pre><code class="language-cpp">// header.hpp
static const int static_var; // Definition einer konstanten statischen Variable vom Typ in.

// foo.cpp:
#include &quot;header.hpp&quot; // inkludiert den Header, der die static_var definiert.

// Du kannst in diesem Modul nun static_var benutzen.

int main() { ... }

// bar.cpp:

// In diesem Modul kannst du static_var aus foo.cpp _nicht_ verwenden, da es internes Linkage
// besitzt. Falls du hier ebenfalls den Header header.hpp einbindest, enthält 
// dieses Modul ebenfalls eine statische Variable namens static_var, die nicht 
// mit dem gleichnamigen Bezeichner aus foo.cpp kollidiert. (Weil internes linkage).
</code></pre>
<p>Beispiel zu 2: (siehe mein erster Post).</p>
<blockquote>
<p>Wenn ich Dich recht verstanden habe, dann geht sowas gar nicht!?</p>
</blockquote>
<p>Was geht nicht? Eine static deklarierte Variable in einer ÜE zu benutzen, in der sie nicht definiert wurde? Nein. Das geht nicht. Warum auch? Du kannst die Variable einfach nicht statisch deklarieren und hast externes Linkage.</p>
<blockquote>
<p>Ausser ich deklariere sie in Globals.h und definiere sie in Globals.cpp.<br />
Danach kann ich sie mit Globals::tagEnd doch irgendwie in nem anderen Header verwenden, wenn ich dort Globals.h inkludiere, oder?</p>
</blockquote>
<p>Wieso Globals::tagEnd? Ansonsten ist dein Gedankengang aber korrekt.</p>
<p>Btw: AFAIK gibt es in der C++-FAQ auch einen Thread zu diesem Thema.</p>
<p>Gruß Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/922176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/922176</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Sun, 20 Nov 2005 13:10:02 GMT</pubDate></item><item><title><![CDATA[Reply to static const in Headern? on Thu, 24 Nov 2005 20:37:32 GMT]]></title><description><![CDATA[<p>Also das Ganze funzt nicht so recht, irgendwas mach ich noch falsch!</p>
<p>Habs nun so:</p>
<p>Datei <a href="http://Globals.cc" rel="nofollow">Globals.cc</a>:</p>
<pre><code>#indeluce &lt;Header für struct TagItem&gt;
const struct TagItem tagEnd = {TAG_END, 0L};
</code></pre>
<p>Datei WindowDataC.h:</p>
<pre><code>...
private:
    extern const struct TagItem tagEnd;
...
</code></pre>
<p>Nun meckert der G++ in dieser Stelle:<br />
storage class specified for field `tagEnd'</p>
<p>Was will er mir denn damit sagen?<br />
Im make-File wird <a href="http://Globals.cc" rel="nofollow">Globals.cc</a> vor den Dateien übersetzt, welche WindowDataC.h verwenden!</p>
<p>Was mach ich noch falsch?</p>
<p>Ciao<br />
Reth</p>
]]></description><link>https://www.c-plusplus.net/forum/post/926483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/926483</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Thu, 24 Nov 2005 20:37:32 GMT</pubDate></item><item><title><![CDATA[Reply to static const in Headern? on Thu, 24 Nov 2005 21:30:26 GMT]]></title><description><![CDATA[<p>Reth schrieb:</p>
<blockquote>
<p>Was mach ich noch falsch?</p>
</blockquote>
<p>Falsch ist, dass du versuchst eine globale Variable in den Private-Bereich einer Klasse zu stecken. Das ist imho schon von der Denkweise der verkehrte Ansatz. Einerseits willst du eine konstante, <em>globale</em> Variable haben, willst diese dann aber in deiner Klasse wieder vor dem Zugriff von außen &quot;verstecken&quot;, willst diese also in der Klasse wieder lokal machen.</p>
<p>Gruß Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/926548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/926548</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Thu, 24 Nov 2005 21:30:26 GMT</pubDate></item><item><title><![CDATA[Reply to static const in Headern? on Thu, 24 Nov 2005 21:36:09 GMT]]></title><description><![CDATA[<p>Das kann sein. Wie gesagt bin absoluter C++ Newbie und dazu noch sehr sehr Java-lastig!</p>
<p>Da gibts immer nur Klassen!</p>
<p>Wie muss ich denn nun die externe Variable in WindowDataC.h verwenden, damit es funktioniert? Im Public-Teil oder gar außerhalb der Klassendefinition?</p>
<p>Ciao<br />
Reth</p>
]]></description><link>https://www.c-plusplus.net/forum/post/926550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/926550</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Thu, 24 Nov 2005 21:36:09 GMT</pubDate></item><item><title><![CDATA[Reply to static const in Headern? on Fri, 25 Nov 2005 07:24:37 GMT]]></title><description><![CDATA[<p>Globale Variablen gehören immer außerhalb der Klassendefinition. (alles in der Definition ist ein Teil der jeweiligen Klasse)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/926639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/926639</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 25 Nov 2005 07:24:37 GMT</pubDate></item><item><title><![CDATA[Reply to static const in Headern? on Fri, 25 Nov 2005 07:52:52 GMT]]></title><description><![CDATA[<p>Vielen Dank. Das habe ich gestern noch ausprobiert und es hat gefunzt, habs nur noch nicht gepostet.</p>
<p>Aber um mal zitiert zu Fragen: Nun, warum ist das so? Sprich: Was ist das Konzept dahinter?</p>
<p>Ciao<br />
Reth</p>
]]></description><link>https://www.c-plusplus.net/forum/post/926662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/926662</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Fri, 25 Nov 2005 07:52:52 GMT</pubDate></item><item><title><![CDATA[Reply to static const in Headern? on Fri, 25 Nov 2005 08:05:56 GMT]]></title><description><![CDATA[<p>Wie ich gerade schon gesagt habe - alles, was innerhalb der Klassendefinition steht, ist ein Teil der Klasse und deshalb nur im Zusammenhang dieser Klasse verwendbar. C hat (im Gegensatz zu Java) einen globalen Namensraum, in den alle Klassen-unabhängigen Definitionen gehören.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/926675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/926675</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 25 Nov 2005 08:05:56 GMT</pubDate></item><item><title><![CDATA[Reply to static const in Headern? on Sat, 26 Nov 2005 15:24:13 GMT]]></title><description><![CDATA[<p>Naja, es müsste so heißen:</p>
<pre><code class="language-cpp">// .hh

class Foo {
private: 
   const TagItem tagEnd; 
   ...
}

// .cc

const Foo::TagItem tagEnd = {TAG_END, 0L};
</code></pre>
<p>Das 'struct' kannste dir Sparen. Das war nur in C so, nicht aber in C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/927223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/927223</guid><dc:creator><![CDATA[Helium]]></dc:creator><pubDate>Sat, 26 Nov 2005 15:24:13 GMT</pubDate></item><item><title><![CDATA[Reply to static const in Headern? on Fri, 25 Nov 2005 21:31:34 GMT]]></title><description><![CDATA[<p>Welcher weg ist denn der richtige, oder gehen beide.</p>
<p>Ich hab nun:</p>
<pre><code>Globals.cc

const struct TagItem tagEnd = {TAG_END, 0L;};

WindowDataC.h

extern struct TagItem tagEnd;

class ...
</code></pre>
<p>Das wird mal compiliert.<br />
Brauch ich struct wirklich nicht mehr, auch wenn TagItem ne Struktur aus nem Header der Betriebssystemfunktionen ist?</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/927342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/927342</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Fri, 25 Nov 2005 21:31:34 GMT</pubDate></item><item><title><![CDATA[Reply to static const in Headern? on Fri, 25 Nov 2005 22:24:38 GMT]]></title><description><![CDATA[<p>In C++ brauchst du das wirklich nicht. Egal wie und wo deine struct declariert ist. Wenn der C++-compiler einen C-header list wird daraus c++ code. Das ist auch der Grund warum du Linker-Fehler bekommst wenn du einen c-header einbindest wo das extern &quot;C&quot; fehlt.<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/927369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/927369</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Fri, 25 Nov 2005 22:24:38 GMT</pubDate></item></channel></rss>