<?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[Lebensdauer von Daten?]]></title><description><![CDATA[<p>Ich habe drei Dateien:</p>
<p>1. Header demo.h</p>
<pre><code class="language-cpp">#ifndef DEMO
#define DEMO
short** DemoArray = NULL;
void* create();
#endif
</code></pre>
<p>2. Funktion in Datei_A.cpp, die das DemoArray erzeugt und die Zeiger<br />
auf nur in der Datei_A bekannte Daten legt:</p>
<pre><code class="language-cpp">#include &quot;demo.h&quot;

static short globaleDaten[] = {5,6,7};

void* create(){
DemoArray = (short**) malloc(3,sizeof(short*));
/* umstaendlich, damit anschaulich */
DemoArray[0] = globaleDaten + 0;
DemoArray[1] = globaleDaten + 1;
DemoArray[2] = globaleDaten + 2;
return DemoArray;
}
</code></pre>
<p>Und jetzt eine dritte Datei, die die Funktion void* create() aufrufen soll:</p>
<pre><code class="language-cpp">#include &quot;demo.h&quot;
int main(){
 create();
 /* usw. */
return 0;
}
</code></pre>
<p>FRAGE: Habe ich jetzt mit dieser Vorgangsweise von der main-Datei aus mithilfe<br />
des **DemoArrays aus dem Header Zugriff auf das 'static globaleDaten[] Daten' Array aus der Datei_A.cpp, oder existiert dieses static globaleDaten[] nur fuer die Dauer, in der ich create() aufrufe? Durch das static wird doch die Lebensdauer von globaleDaten[] auf die Datei_A.cpp begrenzt? Oder bringe ich da etwas durcheinander?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/212852/lebensdauer-von-daten</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 15:55:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/212852.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 11 May 2008 12:49:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lebensdauer von Daten? on Sun, 11 May 2008 12:49:25 GMT]]></title><description><![CDATA[<p>Ich habe drei Dateien:</p>
<p>1. Header demo.h</p>
<pre><code class="language-cpp">#ifndef DEMO
#define DEMO
short** DemoArray = NULL;
void* create();
#endif
</code></pre>
<p>2. Funktion in Datei_A.cpp, die das DemoArray erzeugt und die Zeiger<br />
auf nur in der Datei_A bekannte Daten legt:</p>
<pre><code class="language-cpp">#include &quot;demo.h&quot;

static short globaleDaten[] = {5,6,7};

void* create(){
DemoArray = (short**) malloc(3,sizeof(short*));
/* umstaendlich, damit anschaulich */
DemoArray[0] = globaleDaten + 0;
DemoArray[1] = globaleDaten + 1;
DemoArray[2] = globaleDaten + 2;
return DemoArray;
}
</code></pre>
<p>Und jetzt eine dritte Datei, die die Funktion void* create() aufrufen soll:</p>
<pre><code class="language-cpp">#include &quot;demo.h&quot;
int main(){
 create();
 /* usw. */
return 0;
}
</code></pre>
<p>FRAGE: Habe ich jetzt mit dieser Vorgangsweise von der main-Datei aus mithilfe<br />
des **DemoArrays aus dem Header Zugriff auf das 'static globaleDaten[] Daten' Array aus der Datei_A.cpp, oder existiert dieses static globaleDaten[] nur fuer die Dauer, in der ich create() aufrufe? Durch das static wird doch die Lebensdauer von globaleDaten[] auf die Datei_A.cpp begrenzt? Oder bringe ich da etwas durcheinander?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1506996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1506996</guid><dc:creator><![CDATA[Guentherle]]></dc:creator><pubDate>Sun, 11 May 2008 12:49:25 GMT</pubDate></item><item><title><![CDATA[Reply to Lebensdauer von Daten? on Sun, 11 May 2008 14:11:36 GMT]]></title><description><![CDATA[<p>Ein nicht-lokales static beeinflusst nicht die Lebensdauer eines Objektes sondern nur die Sichtbarkeit des Namens. Ein solches als static deklariertes Objekt existiert für jede Übersetzungseinheit, die es deklariert, separat, während im Falle von external linakge der Name in allen Übersetzungseinheit auf ein und dasselbe Objekt verweist. Nichts daran hindert dich daran, ein in einer anderen Übersetzungseinheit definiertes static-Objekt zu benutzen, soweit dies auf anderem Wege als über dessen Namen geschieht. Im Übrigen ist</p>
<pre><code class="language-cpp">short** DemoArray = NULL;
</code></pre>
<p>eine Definition und darf nicht im Header erfolgen - dort sollte nur die Deklaration</p>
<pre><code class="language-cpp">extern short** DemoArray;
</code></pre>
<p>stehen.</p>
<p>Anzumerken ist, dass static bei nicht-lokalen Bezeichnern nicht mehr erwünscht ist - unbenannte Namensräume sind eine bessere Alternative (u.a. können Zeiger auf static-Objekte nicht als Templateargumente eingesetzt werden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1507036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507036</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 11 May 2008 14:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to Lebensdauer von Daten? on Sun, 11 May 2008 15:33:21 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Ein nicht-lokales static beeinflusst nicht die Lebensdauer eines Objektes sondern nur die Sichtbarkeit des Namens. Ein solches als static deklariertes Objekt existiert für jede Übersetzungseinheit, die es deklariert, separat, während im Falle von external linakge der Name in allen Übersetzungseinheit auf ein und dasselbe Objekt verweist. Nichts daran hindert dich daran, ein in einer anderen Übersetzungseinheit definiertes static-Objekt zu benutzen, soweit dies auf anderem Wege als über dessen Namen geschieht. Im Übrigen ist</p>
<pre><code class="language-cpp">short** DemoArray = NULL;
</code></pre>
<p>eine Definition und darf nicht im Header erfolgen - dort sollte nur die Deklaration</p>
<pre><code class="language-cpp">extern short** DemoArray;
</code></pre>
<p>stehen.</p>
<p>Anzumerken ist, dass static bei nicht-lokalen Bezeichnern nicht mehr erwünscht ist - unbenannte Namensräume sind eine bessere Alternative (u.a. können Zeiger auf static-Objekte nicht als Templateargumente eingesetzt werden).</p>
</blockquote>
<p>Wenn die globale Variable DemoArray im Header mit extern deklariert wird,<br />
dann findet der Linker von selber heraus, wo sie definiert ist? Wird durch so eine extern-Deklaration eine globale static Variable auch in anderen Quelldateien als in jener sichtbar, in der sie definiert ist? Dann könnte ich mir den Umweg mit dem indirekten Zugriff über die Zeiger womoeglich sparen?<br />
Mein momentanes Projekt hat sich ziemlich ausgewachsen (4000 Codezeilen in einer einzigen Quelldatei...), und jetzt versuche ich das Ding etwas zu modularisieren. Leider sind einige relativ komplexe Funktionen dabei, für die ein Satz globaler Variablen überaus wichtig ist, auf die sie alle Zugriff haben müssen. Ich kenn' mich mit Klassen leider nicht sonderlich gut aus, sonst wäre es wohl geschickter, die Variablen und Funktionen in einer Klasse zusammen zu fassen ...</p>
<p>Besten Dank für den Tipp mit extern!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1507062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507062</guid><dc:creator><![CDATA[Guentherle]]></dc:creator><pubDate>Sun, 11 May 2008 15:33:21 GMT</pubDate></item></channel></rss>