<?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[Problem mit struct]]></title><description><![CDATA[<p>Wieso erzeugt mein Compiler hier Warnungen?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;test_struktur.
using namespace std;

int main()
{
obj.test = &quot;abc&quot;;
cout &lt;&lt; obj.test &lt;&lt; endl;

return 0;
}
</code></pre>
<pre><code class="language-cpp">struct my_struct
{
	std::string test;
};
my_struct obj;
</code></pre>
<p>[BCC32 Warnung] xlocinfo(53): W8058 Präcompilierter Header: Initialisierte Daten im Header kann nicht erzeugt werden</p>
<p>[ILINK32 Warnung] Warning: Public Symbol '_obj' ist in Modul C:\DOKUMENTE UND EINSTELLUNGEN\User\DESKTOP\Struktur\DEBUG\Struktur.OBJ und C:\DOKUMENTE UND EINSTELLUNGEN\User\DESKTOP\Struktur\DEBUG\Struktur.OBJ definiert</p>
<p>Bei einer Klasse kann ich das ja so machen das keine Warnungen kommen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;test_struktur.h&quot;
using namespace std;

int main()
{
obj.test = &quot;abc&quot;;
cout &lt;&lt; obj.test &lt;&lt; endl;

return 0;
}
</code></pre>
<pre><code class="language-cpp">class my_class
{public:
	std::string test;
};
my_class obj;
extern my_class obj;
</code></pre>
<p>Btw. ist das eigentlich ok so mit dem extern?</p>
<p>Wenn ich im struct das extern verwende dann kommt:<br />
[ILINK32 Fehler] Error: Nicht aufl÷sbares externes '_obj'</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306786/problem-mit-struct</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 07:49:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306786.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Aug 2012 13:47:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit struct on Tue, 07 Aug 2012 13:47:07 GMT]]></title><description><![CDATA[<p>Wieso erzeugt mein Compiler hier Warnungen?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;test_struktur.
using namespace std;

int main()
{
obj.test = &quot;abc&quot;;
cout &lt;&lt; obj.test &lt;&lt; endl;

return 0;
}
</code></pre>
<pre><code class="language-cpp">struct my_struct
{
	std::string test;
};
my_struct obj;
</code></pre>
<p>[BCC32 Warnung] xlocinfo(53): W8058 Präcompilierter Header: Initialisierte Daten im Header kann nicht erzeugt werden</p>
<p>[ILINK32 Warnung] Warning: Public Symbol '_obj' ist in Modul C:\DOKUMENTE UND EINSTELLUNGEN\User\DESKTOP\Struktur\DEBUG\Struktur.OBJ und C:\DOKUMENTE UND EINSTELLUNGEN\User\DESKTOP\Struktur\DEBUG\Struktur.OBJ definiert</p>
<p>Bei einer Klasse kann ich das ja so machen das keine Warnungen kommen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;test_struktur.h&quot;
using namespace std;

int main()
{
obj.test = &quot;abc&quot;;
cout &lt;&lt; obj.test &lt;&lt; endl;

return 0;
}
</code></pre>
<pre><code class="language-cpp">class my_class
{public:
	std::string test;
};
my_class obj;
extern my_class obj;
</code></pre>
<p>Btw. ist das eigentlich ok so mit dem extern?</p>
<p>Wenn ich im struct das extern verwende dann kommt:<br />
[ILINK32 Fehler] Error: Nicht aufl÷sbares externes '_obj'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239663</guid><dc:creator><![CDATA[struc_t]]></dc:creator><pubDate>Tue, 07 Aug 2012 13:47:07 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit struct on Tue, 07 Aug 2012 14:27:46 GMT]]></title><description><![CDATA[<p><strong>1. Der Compiler hat immer recht.<br />
2. Der Compiler hat immer recht.<br />
3. Der Compiler hat immer recht.<br />
4. Der Compiler hat immer recht.<br />
5. Der Compiler hat immer recht.<br />
...<br />
99. Du sollst die Grundlagen über Deklaration und Definition lernen.<br />
...<br />
999. Du sollst keine Definitionen in Headerdateien vornehmen.<br />
...<br />
...</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239681</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Tue, 07 Aug 2012 14:27:46 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit struct on Tue, 07 Aug 2012 14:30:37 GMT]]></title><description><![CDATA[<p>Das Problem ist, dass Du eine globale Instanz im Header definierst. Der Compiler generiert dann eine Instanz der Klasse und exportiert das globale Symbol &quot;obj&quot;. Soweit ist das in Ordnung. Wenn Du die Headerdatei in einer anderen Sourcedatei includierst, dann wird der Compiler das gleiche machen, wenn er die andere Sourcedatei übersetzt. Der Linker will dann die 2 vom Compiler generierten Objektdateien Linken und findet aber 2 mal das globale Symbol &quot;obj&quot;. Das mag der Linker nicht.</p>
<p>Objektdefinitionen gehören daher immer in die Sourcedatei. Im Header dürfen nur Deklarationen auftauchen.</p>
<p>Zur Verdeutlichung:</p>
<pre><code class="language-cpp">my_class obj;
</code></pre>
<p>ist eine Definition. Da sage ich dem Compiler: bitte lege das Objekt an und rufe seinen Konstruktor auf. Das Schlüsselwort extern macht daraus eine Deklaration:</p>
<pre><code class="language-cpp">extern my_class obj;
</code></pre>
<p>sagt dem Compiler: &quot;es existiert ein globales Objekt mit dem Namen &quot;obj&quot;. Der Compiler kann es verwenden und verlässt sich darauf, dass der Linker das Objekt dann nachher findet.</p>
<p>Du verwendest offensichtlich den Microsoft Compiler. Der verwendet hier offensichtlich präcompilierte Header und dieser Mechanismus geht davon aus, dass die Regel auch eingehalten wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239686</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Tue, 07 Aug 2012 14:30:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit struct on Tue, 07 Aug 2012 14:50:31 GMT]]></title><description><![CDATA[<p>Wutz schrieb:</p>
<blockquote>
<p><strong>999. Du sollst keine Definitionen in Headerdateien vornehmen.</strong></p>
</blockquote>
<p>Es sei denn Klassendefinitionen. In allen Geschmacksrichtungen (d.h. auch enums und unions, wenns denn unbedingt unions sein müssen). Ach ja, und Templatedefintionen. Und Definitionen von inline-Funktionen (sei es jetzt freistehend oder implizit als Methoden in Klassendefinitionen).<br />
Ach, und vielleicht statische Konstanten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239698</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 07 Aug 2012 14:50:31 GMT</pubDate></item></channel></rss>