<?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 in Header Dateien]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Verständnisfrage die sich um die Verwendung von static in Headerdateien und der damit erzwungenen &quot;internal linkage&quot; dreht.<br />
Ursprünglicher Zweck des Codes war es in einem Header ein Array anzulegen und zwar so das in jeder Übersetzereinheit die den Header benutzt eine eigene Kopie des Arrays erstellt wird. Die abgespeckten Versionen der Übersetzereinheit a.cpp und b.cpp sehen so aus:</p>
<pre><code class="language-cpp">// a.h
void a_smth();

// a.cpp
#include &lt;iostream&gt;
#include &quot;header.h&quot;

void a_smth()
{ 
	std::cout &lt;&lt; &quot;a: &quot; &lt;&lt; &amp;ptr &lt;&lt; std::endl;
}
</code></pre>
<p>und zwei weitere Dateien die genauso aussehen</p>
<pre><code class="language-cpp">// b.h
void b_smth();

// b.cpp
#include &lt;iostream&gt;
#include &quot;header.h&quot;

void b_smth()
{ 
	std::cout &lt;&lt; &quot;b: &quot; &lt;&lt; &amp;ptr &lt;&lt; std::endl;
}
</code></pre>
<p>der von beiden Dateien benutzte Header sieht so aus:</p>
<pre><code class="language-cpp">// header.h
#include &lt;iostream&gt;

static unsigned int *ptr;

class init{
public:
	init(){ 
		std::cout &lt;&lt; &quot;header: &quot; &lt;&lt; &amp;ptr &lt;&lt; std::endl; 
		ptr=new unsigned int[1000];
	}
	~init() {delete []ptr;}
};
static init s_init;
</code></pre>
<p>a.cpp und b.cpp sollten also jeweils &quot;ihr eigenes&quot; ptr und s_init bekommen.<br />
Wenn man jetzt a/b_smth aus main aufruft, also sowas macht:</p>
<pre><code class="language-cpp">#include &quot;a.h&quot;
#include &quot;b.h&quot;

int main(int argc, char* argv[])
{
	a_smth();
	b_smth();
	return 0;
}
</code></pre>
<p>erhält man die Ausgabe</p>
<blockquote>
<p>header: 0081B148<br />
header: 0081B148<br />
a: 0081B148<br />
b: 0081B150</p>
</blockquote>
<p>Es werden also wie erwartet zwei ptr's und s_init's angelegt. In a_smth und b_smth liegen die pointer ja an verschiedenen Speicheradressen. Im Konstruktor von init ist aber offensichtlich nur das eine ptr sichtbar. Ich hätte erwartet das jeweils &quot;das passende&quot; ptr sichtbar ist da es ja mit internal linkage erzeugt wurde also in der gesamten quelldatei sichtbar sein sollte. Was stimmt da mit meinem Verständnis nicht?</p>
<p>Vielen Dank für's lesen und nachdenken schonmal!</p>
<p>PS: Das praktische Problem - also das erzeugen von einem Array pro Übersetzereinheit - hab ich gelöst in dem ich das ptr zu einem public member von init gemacht habe. Dann ist auch im Konstruktor jeweils das passende ptr sichtbar. Es geht mir hier also mehr um das Verständnis als um eine Lösung ...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/276605/static-in-header-dateien</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 08:56:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/276605.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Nov 2010 15:06:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static in Header Dateien on Fri, 05 Nov 2010 15:06:51 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Verständnisfrage die sich um die Verwendung von static in Headerdateien und der damit erzwungenen &quot;internal linkage&quot; dreht.<br />
Ursprünglicher Zweck des Codes war es in einem Header ein Array anzulegen und zwar so das in jeder Übersetzereinheit die den Header benutzt eine eigene Kopie des Arrays erstellt wird. Die abgespeckten Versionen der Übersetzereinheit a.cpp und b.cpp sehen so aus:</p>
<pre><code class="language-cpp">// a.h
void a_smth();

// a.cpp
#include &lt;iostream&gt;
#include &quot;header.h&quot;

void a_smth()
{ 
	std::cout &lt;&lt; &quot;a: &quot; &lt;&lt; &amp;ptr &lt;&lt; std::endl;
}
</code></pre>
<p>und zwei weitere Dateien die genauso aussehen</p>
<pre><code class="language-cpp">// b.h
void b_smth();

// b.cpp
#include &lt;iostream&gt;
#include &quot;header.h&quot;

void b_smth()
{ 
	std::cout &lt;&lt; &quot;b: &quot; &lt;&lt; &amp;ptr &lt;&lt; std::endl;
}
</code></pre>
<p>der von beiden Dateien benutzte Header sieht so aus:</p>
<pre><code class="language-cpp">// header.h
#include &lt;iostream&gt;

static unsigned int *ptr;

class init{
public:
	init(){ 
		std::cout &lt;&lt; &quot;header: &quot; &lt;&lt; &amp;ptr &lt;&lt; std::endl; 
		ptr=new unsigned int[1000];
	}
	~init() {delete []ptr;}
};
static init s_init;
</code></pre>
<p>a.cpp und b.cpp sollten also jeweils &quot;ihr eigenes&quot; ptr und s_init bekommen.<br />
Wenn man jetzt a/b_smth aus main aufruft, also sowas macht:</p>
<pre><code class="language-cpp">#include &quot;a.h&quot;
#include &quot;b.h&quot;

int main(int argc, char* argv[])
{
	a_smth();
	b_smth();
	return 0;
}
</code></pre>
<p>erhält man die Ausgabe</p>
<blockquote>
<p>header: 0081B148<br />
header: 0081B148<br />
a: 0081B148<br />
b: 0081B150</p>
</blockquote>
<p>Es werden also wie erwartet zwei ptr's und s_init's angelegt. In a_smth und b_smth liegen die pointer ja an verschiedenen Speicheradressen. Im Konstruktor von init ist aber offensichtlich nur das eine ptr sichtbar. Ich hätte erwartet das jeweils &quot;das passende&quot; ptr sichtbar ist da es ja mit internal linkage erzeugt wurde also in der gesamten quelldatei sichtbar sein sollte. Was stimmt da mit meinem Verständnis nicht?</p>
<p>Vielen Dank für's lesen und nachdenken schonmal!</p>
<p>PS: Das praktische Problem - also das erzeugen von einem Array pro Übersetzereinheit - hab ich gelöst in dem ich das ptr zu einem public member von init gemacht habe. Dann ist auch im Konstruktor jeweils das passende ptr sichtbar. Es geht mir hier also mehr um das Verständnis als um eine Lösung ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975548</guid><dc:creator><![CDATA[mind machine]]></dc:creator><pubDate>Fri, 05 Nov 2010 15:06:51 GMT</pubDate></item></channel></rss>