<?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 + seltsames verhalten]]></title><description><![CDATA[<p>Hi, mal wieder ein Problem. Bei mir hat jede Klasse eine statische Funktion</p>
<pre><code>Info&amp; GetInfo()
	{
		static Info info(...);
		return info;
	}
</code></pre>
<p>mit der ich Information über die Klasse wie den Namen usw. abrufen kann. Zusätzlich haben die Klassen statische Member die über eine statische Funktion &quot;Init&quot; einer anderen Klasse initalisiert werden, z.B so:</p>
<pre><code>Property MyClass::myProperty = Property::Init(L&quot;MyClass&quot;);
</code></pre>
<p>Das funktioniert prima. Allerdings möchte ich nun nicht nur den Klassennamen der Initfunktion übergeben sondern gleich den ganzen Infomember, also z.B. so:</p>
<pre><code>Property MyClass::myProperty = Property::Init(GetInfo());
</code></pre>
<p>Das funktioniert auch aber diesmal stimmt etwas nicht. Beim Laden der Anwendung werden diverse Dateien geladen, deren Namen ich mir mit den zugehörigen Fehlermeldungen in einer Console ausgeben lasse. Seltsamerweise werden jetzt plötzlich keine Fehlermeldungen mehr ausgegeben, jedoch werden die Namen der Dateien die geladen werden angezeigt. Die Dateien werden auch tatsächlich geladen.<br />
Kann es sein dass der Compiler hier irgendwie rumoptimiert und schon Code in der &quot;Initialisierungspahse&quot; der statischen Member ausführt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286061/static-seltsames-verhalten</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 02:35:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286061.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 May 2011 22:51:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static + seltsames verhalten on Mon, 02 May 2011 22:51:26 GMT]]></title><description><![CDATA[<p>Hi, mal wieder ein Problem. Bei mir hat jede Klasse eine statische Funktion</p>
<pre><code>Info&amp; GetInfo()
	{
		static Info info(...);
		return info;
	}
</code></pre>
<p>mit der ich Information über die Klasse wie den Namen usw. abrufen kann. Zusätzlich haben die Klassen statische Member die über eine statische Funktion &quot;Init&quot; einer anderen Klasse initalisiert werden, z.B so:</p>
<pre><code>Property MyClass::myProperty = Property::Init(L&quot;MyClass&quot;);
</code></pre>
<p>Das funktioniert prima. Allerdings möchte ich nun nicht nur den Klassennamen der Initfunktion übergeben sondern gleich den ganzen Infomember, also z.B. so:</p>
<pre><code>Property MyClass::myProperty = Property::Init(GetInfo());
</code></pre>
<p>Das funktioniert auch aber diesmal stimmt etwas nicht. Beim Laden der Anwendung werden diverse Dateien geladen, deren Namen ich mir mit den zugehörigen Fehlermeldungen in einer Console ausgeben lasse. Seltsamerweise werden jetzt plötzlich keine Fehlermeldungen mehr ausgegeben, jedoch werden die Namen der Dateien die geladen werden angezeigt. Die Dateien werden auch tatsächlich geladen.<br />
Kann es sein dass der Compiler hier irgendwie rumoptimiert und schon Code in der &quot;Initialisierungspahse&quot; der statischen Member ausführt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057521</guid><dc:creator><![CDATA[StaticPanic]]></dc:creator><pubDate>Mon, 02 May 2011 22:51:26 GMT</pubDate></item><item><title><![CDATA[Reply to static + seltsames verhalten on Mon, 02 May 2011 22:57:23 GMT]]></title><description><![CDATA[<p>Was für Fehlermeldungen meinst du denn?</p>
<p>Zu deinem Code: Du hast dort eine statische (lokale) Variable. Diese wird beim ersten Mal, wenn die Funktion aufgerufen wird, angelegt und initialisiert. Bei weiteren Funktionsaufrufen existiert die Variable bereits und wird nur noch zurückgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057525</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 02 May 2011 22:57:23 GMT</pubDate></item><item><title><![CDATA[Reply to static + seltsames verhalten on Mon, 02 May 2011 23:14:02 GMT]]></title><description><![CDATA[<p>Das sind nur unwichtige Warnungen die ich selber ausgebe da meine Implementierung noch nicht komplett ist. Diese haben auf das Verhalten des Programms aber keinen Einfluss. Mit der ersten Variante sieht die Console etwa so aus:</p>
<pre><code>Lade Datei 'ErsteDatei.abc'...
Error: ...
...
Error: ...
Lade Datei 'ZweiteDatei.abc'...
Error: ...
usw.
</code></pre>
<p>Mit der zweiten Variante wird in der Console nur noch folgendes ausgegeben:</p>
<pre><code>Lade Datei 'ErsteDatei.abc'...
Lade Datei 'ZweiteDatei.abc'...
Lade Datei 'DritteDatei.abc'...
usw.
</code></pre>
<p>Ich kann auch beliebige weitere Ausgaben in der Console machen aber sie erscheinen nicht, obwohl der Code nachweislich ausgeführt wird.<br />
Ich habe auch gerade nochmal in Visual Studio nachgeschaut. Ich habe gar keine Optimierungen eingeschaltet. Das ist es also nicht.<br />
Ich glaube ich schreibe mal ein Mini-Programm ansonsten dürfte es für euch schwierig werden was ich meine.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057529</guid><dc:creator><![CDATA[StaticPanic]]></dc:creator><pubDate>Mon, 02 May 2011 23:14:02 GMT</pubDate></item><item><title><![CDATA[Reply to static + seltsames verhalten on Mon, 02 May 2011 23:50:21 GMT]]></title><description><![CDATA[<blockquote>
<p>Kann es sein dass der Compiler hier irgendwie rumoptimiert und schon Code in der &quot;Initialisierungspahse&quot; der statischen Member ausführt?</p>
</blockquote>
<p>Ja klar macht er das, wie soll es auch sonst gehen?</p>
<p>Grob vereinfacht geht das so:</p>
<ol>
<li>Alles was global/static ist mit Nullbytes anfüllen</li>
<li>Konstante globale/static Variablen mit ihrem Wert anfüllen (*)</li>
<li>Dynamisch initialisierte globale/static Variablen initialisieren (*)</li>
<li>main() aufrufen</li>
</ol>
<p>Da dein <code>MyClass::myProperty</code> offensichtlich ein <code>static</code> Member ist, und offensichtlich dynamisch initialisiert wird ( <code>Property::Init</code> ist ja eine Funktion, ebenso wie <code>GetInfo()</code> ), läuft das also in (3). Und wenn du dabei <code>GetInfo()</code> aufrufst, dann wird das eben genau an der Stelle ausgeführt, und genau an der Stelle läuft dann auch der Kunstruktor von <code>static Info info</code> .</p>
<p>----</p>
<p>*: 1 &amp; 2 können vom Compiler zu einem Schritt zusammengefasst werden.</p>
<p>Was (3) angeht: der Compiler *dürfte* das so lange verzögern, bis die erste Funktion aus der Übersetzungseinheit aufgerufen wird, in der die globalen/static Variablen definiert sind. Bloss tut das kein mir bekannter Compiler. Das oben beschriebene Verhalten ist auch vollkommen standardkonform, der Standard erlaubt explizit dass alles vor dem Beginn von main() initialisiert wird.</p>
<p>Ausgenommen natürlich static Variablen in Funktionen, diese dürfen erst initialisiert werden wenn die Funktion zum 1. mal aufgerufen wird. In deinem Beispiel findet dieser 1. Aufruf der <code>GetInfo()</code> Funktion allerdings in Phase (3) statt, und daher muss auch die Funktions-lokale static Variable &quot;info&quot; zu diesem Zeitpunkt initialisiert werden.</p>
<p>----</p>
<p>Was lernen wir daraus: &quot;static&quot; in C++ ist eine ganz gemeine hinterhältige Sache <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/2057536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057536</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 02 May 2011 23:50:21 GMT</pubDate></item><item><title><![CDATA[Reply to static + seltsames verhalten on Tue, 03 May 2011 13:10:06 GMT]]></title><description><![CDATA[<p>Ok, ich habe den Fehler gefunden. Ich habe in der Init-Funktion während der Initialisierungspahse eine Fehlermeldung mit std::wcerr ausgegeben was zu Folge hat, dass dann auch später im Programm keine Ausgaben per wcerr mehr funktionieren. Warum auch immer. Lediglich die Ausgabe per wcout hat noch funktioniert weshalb auch die Ausgabe der Dateinamen in der Console erschien, nicht aber die Fehlermeldungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057759</guid><dc:creator><![CDATA[StaticPanic]]></dc:creator><pubDate>Tue, 03 May 2011 13:10:06 GMT</pubDate></item><item><title><![CDATA[Reply to static + seltsames verhalten on Tue, 03 May 2011 14:28:21 GMT]]></title><description><![CDATA[<p>Im grunde kannst du das komplette Programm bereits <em>vor</em> der main() laufen lassen, wenn du deren Parameter nicht brauchst:</p>
<pre><code class="language-cpp">int myRealMain() {
  /* Hauptprogramm..... */
}

const int returnCode = myRealMain(); //wird in  Phase 3 aufgerufen

int main()
{
  return returnCode;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2057840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057840</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 03 May 2011 14:28:21 GMT</pubDate></item></channel></rss>