<?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[wieso muss ich das als extern deklarieren]]></title><description><![CDATA[<p>Hi<br />
also ich hab eine main.cpp sowie eine game.h mit zugehöriger game.cpp.<br />
Jetzt brauche ich in der game.cpp Objekte vom Typ LPDIRECTDRAW7. Wenn ich diese allerdings in der game.h deklariere und dann in der game.cpp benutzen will, bekomme ich vom Linker folgende Fehlermeldungen:</p>
<blockquote>
<p>main.obj : error LNK2005: &quot;struct IDirectDraw7 * lpdd7&quot; (?lpdd7@@3PAUIDirectDraw7@@A) bereits in game.obj definiert<br />
main.obj : error LNK2005: &quot;struct IDirectDraw7 * lpdd7&quot; (?lpdd7@@3PAUIDirectDraw7@@A) bereits in game.obj definiert<br />
Debug/DirectX.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden<br />
Fehler beim Ausführen von link.exe.</p>
</blockquote>
<p>Das ganze ist ungefähr so aufgebaut (Syntaxfehler enthält es im Original keine):</p>
<pre><code class="language-cpp">//main.cpp

#include game.h

WinMain...
{
Game_Init();
}

//game.h
LPDIRECTDRAW7 lpdd7 = NULL;

//game.cpp

#include game.h

void Game_Init()
{
//Aufrufe von lpdd7, Erstellung und so ...

}
</code></pre>
<p>Wenn ich lpdd7 hingegen in der main.cpp deklariere und in der game.h mit extern kennzeichne, dann läuft es einwandfrei.</p>
<p>Warum geht das nur mit extern, obwohl ich in der main.cpp ja nicht auf lpdd7 zugreife sondern nur in game.cpp?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/169375/wieso-muss-ich-das-als-extern-deklarieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 17:43:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/169375.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Jan 2007 19:00:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to wieso muss ich das als extern deklarieren on Thu, 04 Jan 2007 19:00:56 GMT]]></title><description><![CDATA[<p>Hi<br />
also ich hab eine main.cpp sowie eine game.h mit zugehöriger game.cpp.<br />
Jetzt brauche ich in der game.cpp Objekte vom Typ LPDIRECTDRAW7. Wenn ich diese allerdings in der game.h deklariere und dann in der game.cpp benutzen will, bekomme ich vom Linker folgende Fehlermeldungen:</p>
<blockquote>
<p>main.obj : error LNK2005: &quot;struct IDirectDraw7 * lpdd7&quot; (?lpdd7@@3PAUIDirectDraw7@@A) bereits in game.obj definiert<br />
main.obj : error LNK2005: &quot;struct IDirectDraw7 * lpdd7&quot; (?lpdd7@@3PAUIDirectDraw7@@A) bereits in game.obj definiert<br />
Debug/DirectX.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden<br />
Fehler beim Ausführen von link.exe.</p>
</blockquote>
<p>Das ganze ist ungefähr so aufgebaut (Syntaxfehler enthält es im Original keine):</p>
<pre><code class="language-cpp">//main.cpp

#include game.h

WinMain...
{
Game_Init();
}

//game.h
LPDIRECTDRAW7 lpdd7 = NULL;

//game.cpp

#include game.h

void Game_Init()
{
//Aufrufe von lpdd7, Erstellung und so ...

}
</code></pre>
<p>Wenn ich lpdd7 hingegen in der main.cpp deklariere und in der game.h mit extern kennzeichne, dann läuft es einwandfrei.</p>
<p>Warum geht das nur mit extern, obwohl ich in der main.cpp ja nicht auf lpdd7 zugreife sondern nur in game.cpp?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202975</guid><dc:creator><![CDATA[Amateur]]></dc:creator><pubDate>Thu, 04 Jan 2007 19:00:56 GMT</pubDate></item><item><title><![CDATA[Reply to wieso muss ich das als extern deklarieren on Thu, 04 Jan 2007 20:29:36 GMT]]></title><description><![CDATA[<p>Amateur schrieb:</p>
<blockquote>
<p>Warum geht das nur mit extern, obwohl ich in der main.cpp ja nicht auf lpdd7 zugreife sondern nur in game.cpp?</p>
</blockquote>
<p>Weil du in main.cpp trotzdem die game.h inkludierst. Dh, in main.cpp steht dann:</p>
<pre><code class="language-cpp">LPDIRECTDRAW7 lpdd7 = NULL;
</code></pre>
<p>Es wird also lpdd7 definiert. Das gleiche wird aber schon mit game.cpp gemacht. Du hast also 2 Definitionen, das geht nicht, da das eine ODR Verletzung ist (One Definition Rule).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1203049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1203049</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Thu, 04 Jan 2007 20:29:36 GMT</pubDate></item><item><title><![CDATA[Reply to wieso muss ich das als extern deklarieren on Thu, 04 Jan 2007 20:48:32 GMT]]></title><description><![CDATA[<p>ok...<br />
kann man das denn irgendwie umgehen oder bleibt mir keine andere Möglichkeit außer extern?<br />
Oder allgemeiner gefasst: Wird extern als gutes oder eher schlechtes Design angesehen? Und wenn es zu schlechtem Design gehört, wie kann man es besser machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1203068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1203068</guid><dc:creator><![CDATA[Amateur]]></dc:creator><pubDate>Thu, 04 Jan 2007 20:48:32 GMT</pubDate></item><item><title><![CDATA[Reply to wieso muss ich das als extern deklarieren on Thu, 04 Jan 2007 20:53:43 GMT]]></title><description><![CDATA[<p>Amateur schrieb:</p>
<blockquote>
<p>kann man das denn irgendwie umgehen oder bleibt mir keine andere Möglichkeit außer extern?</p>
</blockquote>
<p>Da muss nichts umgangen werden. Genau dafür ist extern da. Du machst damit einen Bezeichner öffentlich bekannt, damit er, wo auch immer, benutzt werden kann. Es ist also lediglich eine Deklaration.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1203070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1203070</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Thu, 04 Jan 2007 20:53:43 GMT</pubDate></item><item><title><![CDATA[Reply to wieso muss ich das als extern deklarieren on Fri, 05 Jan 2007 07:24:27 GMT]]></title><description><![CDATA[<p>Amateur schrieb:</p>
<blockquote>
<p>kann man das denn irgendwie umgehen oder bleibt mir keine andere Möglichkeit außer extern?</p>
</blockquote>
<p>extern <strong>ist</strong> der Weg, das Problem zu &quot;umgehen&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>(und globale Variablen gelten schon von sich aus als schlechtes Design, aber wenn du sie wirklich benötigst,...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1203260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1203260</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 05 Jan 2007 07:24:27 GMT</pubDate></item><item><title><![CDATA[Reply to wieso muss ich das als extern deklarieren on Fri, 05 Jan 2007 08:55:30 GMT]]></title><description><![CDATA[<p>- eine Alternative waer halt die Globale variable zu eliminieren.</p>
<p>bedeutet dein Pointer zur DD Schnittstelle wird in main definiert ... und als parameter in alle funktionen durchgereicht.</p>
<p>IMHO Geschmakssache, globale variablen versus &quot;ellenlange&quot; paramterlisten bei den methoden / members. Hasst du mehrere so Dinge die ueberall braucht (Sound-Schnittstelle, logfile ...) kannst die wiederum zusammen in ein object fassen und das auf 1 parameter reduzieren.</p>
<p>- Bleibst bei der globalen Variablen variante, besteht noch die moeglichkeit, das ding in ner static variable ner Klasse zu tarnen, und viel der grundlegenden funktionalitaet gleich mit in die klasse zu schieben. Das ganze dann noch als singleton implementiert (soll ja keine 2 instanzen fuer DDraw geben oder ?). Bleibt aber immer noch im prinzip ne globale variable, aber viel eleganter halt.</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1203318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1203318</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Fri, 05 Jan 2007 08:55:30 GMT</pubDate></item><item><title><![CDATA[Reply to wieso muss ich das als extern deklarieren on Fri, 05 Jan 2007 12:26:55 GMT]]></title><description><![CDATA[<p>Ja die Idee mit der Klasse hatte ich auch schon.<br />
Das würde dann auch als nächstes kommen. Momentan geht es mir erstmal darum, das Prinzip von DirectX zu verstehen. Das ist im Moment noch schwer genug für mich. Und da ich bei Klassen auch noch nicht alles zu 100% verstanden habe bzw. noch Übung brauche, würde das ganze mit Klassen doppelt kompliziert.<br />
Trotzdem danke für die Tipps und sobald ich soweit bin, werd ich mich dran machen und das ganze in ein Klassenkonzept umwandeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1203492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1203492</guid><dc:creator><![CDATA[Amateur]]></dc:creator><pubDate>Fri, 05 Jan 2007 12:26:55 GMT</pubDate></item><item><title><![CDATA[Reply to wieso muss ich das als extern deklarieren on Sat, 06 Jan 2007 14:30:57 GMT]]></title><description><![CDATA[<p>Nur noch eine kurze Frage dazu.<br />
Was wäre sinnvoller oder korrekter:</p>
<p>In der game.cpp die Variablen definieren und in der zugehörigen game.h sie als extern zu deklarieren<br />
oder<br />
sie in der game.h zu definieren und in der main.cpp als extern zu deklarieren?</p>
<p>VC++ nimmt beides an, nur erscheint mir die erste Variante besser oder korrekter in der Verwendung von extern oder täusche ich mich da?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204321</guid><dc:creator><![CDATA[Amateur]]></dc:creator><pubDate>Sat, 06 Jan 2007 14:30:57 GMT</pubDate></item><item><title><![CDATA[Reply to wieso muss ich das als extern deklarieren on Sat, 06 Jan 2007 15:39:59 GMT]]></title><description><![CDATA[<p>Amateur schrieb:</p>
<blockquote>
<p>VC++ nimmt beides an, nur erscheint mir die erste Variante besser oder korrekter in der Verwendung von extern oder täusche ich mich da?</p>
</blockquote>
<p>Nein, da täuschst du dich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204389</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sat, 06 Jan 2007 15:39:59 GMT</pubDate></item></channel></rss>