<?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[Kreuz und quer durch C++, alles ist dabei ...]]></title><description><![CDATA[<p>1. Templateklassenendeklaration und -definition nicht getrennt verwaltbar.</p>
<p>Ich habe, weil es mir zum Hals rausgehängt hat, nicht mit Listen umgehen zu können, selbst eine Liste erstellt. Diese besteht aus 5 Klassen:</p>
<p>CBasicNode<br />
CHeadNode<br />
CInternalNode<br />
CEndNode<br />
CList</p>
<p>CBasicNode ist die Basisklasse für CHeadNode, CInternalNode und CEndNode. Sie hat nur jeweils einen Zeiger zum nächsten und zum vorherigen Element. CHeadNode makiert die Anfang, CEndNode das Ende der Liste, und CInternalNode nimmt den eigentlichen Wert auf. CList verwaltet Listenkopf und Listenende (CHeadNode und CEndNode) und stellt Funktionen hinzu.</p>
<p>Weil ich noch so gut wie keine Erfahrung mit der STL gemacht habe und mich Template-Syntaxfehler besonders lieben, wollte ich meine ursprünglich auf einen DWORD-Wert ausgerichtete Klasse CInternalNode und CList in Templateklassen verwandeln, um in späteren Programmen diese zu verwenden (da weiss man, was man hat). Nachdem ich die entsprechende Änderungen vorgenommen habe, zeigte mir mein Compiler (MSVC++ 2008 Pro) 6-Linkerfehler an, dass Templatefunktionsdefinitionen von CList und CInternalNode fehlen würden. Dazu muss gesagt werden, dass ich die Klasse an sich in eine Headerdatei verpackt habe, die Funktionsdefinitionen aber in eine .cpp-Datei speichere.</p>
<p>Dann habe ich (aus Zufall und Langeweile) den Inhalt der cpp-Dateien in die Headerdateien verschoben, und plötzlich lief es. Trotzdem würde ich Deklaration und Definition gerne separat sichern - oder ist das nicht möglich?</p>
<p>2. Funktionen in eine DLL speichern - wie?</p>
<p>Eigentlich hatte ich geplant, die oben erwähnten Funktionsdefinitionen der Klassen in eine DLL zu verpacken. Dummerweise habe ich keine Ahnung vom DLL-erstellen, weiss aber, dass es die Schlüsselwörter</p>
<pre><code class="language-cpp">__declspec(dllimport)
__declspec(dllexprot)
</code></pre>
<p>gibt. Und das war's auch schon. Weiss jemand, wie ich meine Funktionen in eine statische Bibliothek oder noch besser in eine DLL verpacke?</p>
<p>3. Die Bezeichnung _w64 und wofür sie steht</p>
<p>Beim zufälligen durchforsten der MFC ist mir die Definition des Typs UINT_PTR aufgefallen. Bei dieser steht das Schlüsselwort _w64, und da ich damit nichts anfangen konnte und auch meine Dokumentation nicht helfen konnte, dachte ich, es gäbe hier jemanden, der mir das sagen könnte.</p>
<p>4. Und noch mal die Liste: bestimmte Funktionen für bestimmte Typen bereitstellen.</p>
<p>Der Vorteil der Templates ist gleichzeitig sein Nachteil: Ich würde gerne bestimmte Funktionen bei bestimmten Typen bereitstellen, aber ich habe keine Lust, eine zweite Liste für Zeiger zu erstellen (Diese müssen anders behandelt werden als normale Variablen). Kann ich bestimmte Funktionen freischalten, wenn der Typ der Klasse statt ein char ein char* ist, oder muss ich wirklich eine neue Klasse schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/247242/kreuz-und-quer-durch-c-alles-ist-dabei</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 13:52:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247242.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 08 Aug 2009 09:05:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Sat, 08 Aug 2009 09:05:55 GMT]]></title><description><![CDATA[<p>1. Templateklassenendeklaration und -definition nicht getrennt verwaltbar.</p>
<p>Ich habe, weil es mir zum Hals rausgehängt hat, nicht mit Listen umgehen zu können, selbst eine Liste erstellt. Diese besteht aus 5 Klassen:</p>
<p>CBasicNode<br />
CHeadNode<br />
CInternalNode<br />
CEndNode<br />
CList</p>
<p>CBasicNode ist die Basisklasse für CHeadNode, CInternalNode und CEndNode. Sie hat nur jeweils einen Zeiger zum nächsten und zum vorherigen Element. CHeadNode makiert die Anfang, CEndNode das Ende der Liste, und CInternalNode nimmt den eigentlichen Wert auf. CList verwaltet Listenkopf und Listenende (CHeadNode und CEndNode) und stellt Funktionen hinzu.</p>
<p>Weil ich noch so gut wie keine Erfahrung mit der STL gemacht habe und mich Template-Syntaxfehler besonders lieben, wollte ich meine ursprünglich auf einen DWORD-Wert ausgerichtete Klasse CInternalNode und CList in Templateklassen verwandeln, um in späteren Programmen diese zu verwenden (da weiss man, was man hat). Nachdem ich die entsprechende Änderungen vorgenommen habe, zeigte mir mein Compiler (MSVC++ 2008 Pro) 6-Linkerfehler an, dass Templatefunktionsdefinitionen von CList und CInternalNode fehlen würden. Dazu muss gesagt werden, dass ich die Klasse an sich in eine Headerdatei verpackt habe, die Funktionsdefinitionen aber in eine .cpp-Datei speichere.</p>
<p>Dann habe ich (aus Zufall und Langeweile) den Inhalt der cpp-Dateien in die Headerdateien verschoben, und plötzlich lief es. Trotzdem würde ich Deklaration und Definition gerne separat sichern - oder ist das nicht möglich?</p>
<p>2. Funktionen in eine DLL speichern - wie?</p>
<p>Eigentlich hatte ich geplant, die oben erwähnten Funktionsdefinitionen der Klassen in eine DLL zu verpacken. Dummerweise habe ich keine Ahnung vom DLL-erstellen, weiss aber, dass es die Schlüsselwörter</p>
<pre><code class="language-cpp">__declspec(dllimport)
__declspec(dllexprot)
</code></pre>
<p>gibt. Und das war's auch schon. Weiss jemand, wie ich meine Funktionen in eine statische Bibliothek oder noch besser in eine DLL verpacke?</p>
<p>3. Die Bezeichnung _w64 und wofür sie steht</p>
<p>Beim zufälligen durchforsten der MFC ist mir die Definition des Typs UINT_PTR aufgefallen. Bei dieser steht das Schlüsselwort _w64, und da ich damit nichts anfangen konnte und auch meine Dokumentation nicht helfen konnte, dachte ich, es gäbe hier jemanden, der mir das sagen könnte.</p>
<p>4. Und noch mal die Liste: bestimmte Funktionen für bestimmte Typen bereitstellen.</p>
<p>Der Vorteil der Templates ist gleichzeitig sein Nachteil: Ich würde gerne bestimmte Funktionen bei bestimmten Typen bereitstellen, aber ich habe keine Lust, eine zweite Liste für Zeiger zu erstellen (Diese müssen anders behandelt werden als normale Variablen). Kann ich bestimmte Funktionen freischalten, wenn der Typ der Klasse statt ein char ein char* ist, oder muss ich wirklich eine neue Klasse schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757259</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Sat, 08 Aug 2009 09:05:55 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Sat, 08 Aug 2009 09:18:42 GMT]]></title><description><![CDATA[<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<p>Trotzdem würde ich Deklaration und Definition gerne separat sichern - oder ist das nicht möglich?</p>
</blockquote>
<p>Bei Templates die Definition in eine cpp-Datei auszulagern kann leider nur der Comeau- (oder so) Compiler. Man kann aber die Definitionen in eine separate Headerdatei (oder auch Endung .impl o.ä.) auslagern und diese am Ende der eigentlichen Headerdatei mit include einbinden. So werden die Definitionen auch überall eingebunden, liegen aber wenigstens in einer separaten Datei.</p>
<blockquote>
<p>3. Die Bezeichnung _w64 und wofür sie steht</p>
</blockquote>
<p>Ist MSVC-spezifisch und wird da verwendet für Typen die verschiedene Größen haben, je nachdem ob du 32- oder 64Bit kompilierst.<br />
Bei <code>ULONG_PTR a=17; UINT b=a;</code> könntest du z.B. eine Warnung bekommen, weil <code>ULONG_PTR</code> im 64Bit-Kompilat größer wäre als <code>UINT</code> (während im 32Bit-Kompilat alles passt).</p>
<blockquote>
<p>4. Und noch mal die Liste: bestimmte Funktionen für bestimmte Typen bereitstellen.</p>
</blockquote>
<p>Du könntest spezielle Funktionen außerhalb der Klasse definieren, die du aus der Klasse heraus aufrufst und die auf den jeweiligen Typ spezialisiert sind. Obwohl man das bei einer Liste eigentlich nicht brauchen sollte.</p>
<p>Zu (2) hab ich grad keine Lust zu antworten :p Aber such mal nach <code>c++ make dll</code> .</p>
<p>Und: Woran hapert es denn bei der Benutzung von std::list? Eigentlich ist die ja ganz simpel zu bedienen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757265</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 08 Aug 2009 09:18:42 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Sat, 08 Aug 2009 09:24:08 GMT]]></title><description><![CDATA[<ol>
<li></li>
</ol>
<p>Der Compiler muss die Templates dort sehen, wo sie verwendet werden. Also müssen sie ins Header File, oder in ein &quot;inline&quot; File (ein File, welches vom Header File inkludiert wird).</p>
<ol start="2">
<li></li>
</ol>
<p>Mit __declspec(dllexport) kannst du Klassen und Funktionen exportieren, und nu rate mal was du mit __declspec(dllimport) machen kannst.<br />
Geht aber mit Templates nicht*, siehe oben.<br />
*: geht schon, aber nur für Instanzierungen der Templates die du vorgibst. D.h. wenn du MeineListe&lt;int&gt; extra angibst, kannst du MeineListe&lt;int&gt; aus der DLL exportieren. Der der die DLL verwendet kann dann aber nur MeineListe&lt;int&gt; und nicht MeineListe&lt;float&gt; oder MeineListe&lt;MeinSuperTyp&gt; verwenden, es sei denn er sieht die Implementierung (siehe wieder Punkt 1)</p>
<ol start="3">
<li></li>
</ol>
<p>__w64 wird verwendet, um dem Compiler mitzuteilen, dass ein Typ zwar 32 Bit gross ist, aber 64 Bit gross wäre, wenn man für 64 Bit compilieren würde.<br />
UINT_PTR etc. sind immer so gross wie ein Zeiger, d.h. bei 32 Bit Systemen eben 32 Bit und bei 64 Bit Systemen 64 Bit.<br />
Der Compiler gibt dir dann eine Warnung aus, wenn du z.B. einen Wert aus einer __w64 Variable in eine &quot;reine&quot; 32 Bit Variable kopierst. Also z.B. DWORD = UINT_PTR.</p>
<ol start="4">
<li></li>
</ol>
<blockquote>
<p>aber ich habe keine Lust, eine zweite Liste für Zeiger zu erstellen (Diese müssen anders behandelt werden als normale Variablen)</p>
</blockquote>
<p>Wieso glaubst du dass du das musst/willst?<br />
Davon abgesehen geht es natürlich. Du kannst alle gemeinsamen Funktionen in ein Basisklassen-Template packen, davon dann ein weiteres Klassen-Template ableiten, und dieses weitere Klassen-Template spezialisierst du dann.<br />
Für &quot;normale&quot; Typen könnte das dann z.B. leer sein (alles schon in der Basisklasse enthalten), und die Spezialisierung für Zeiger hat dann halt ein paar Funktionen zusätzlich.</p>
<ol start="5">
<li></li>
</ol>
<p>Google ist dein Freund.</p>
<ol start="6">
<li></li>
</ol>
<p>Die MSDN ist dein Freund.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757268</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 08 Aug 2009 09:24:08 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Sat, 08 Aug 2009 09:32:30 GMT]]></title><description><![CDATA[<ol>
<li>
<p>Danke! Heisst also, ich kann mir das sparen (Es sei denn, die Klasse bekommt direkten Zugriff).</p>
</li>
<li>
<p>Habe ich ja schon gemacht:</p>
</li>
</ol>
<pre><code class="language-cpp">typedef CLink &lt;int      &gt; CIntLink;
typedef CLink &lt;short int&gt; CShortLink;
typedef CLink &lt;long int &gt; CLongLink;
</code></pre>
<p>Problem ist: ich weiss nicht mal, WIE aus meinem schnöden Code eine binäre DLL wird.</p>
<p>3. Danke. Das hat mich ein bisschen Wahnsinnig gemacht.</p>
<p>4. Ich weiss auch nicht. Vielleicht mag ich es nicht, die Werkzeuge fremder MEnschen zu nutzen, deren Code ich (noch nicht) verstehe. Solange ich jedoch nicht den Durchblick habe, werde ich schön die Finger davon lassen.</p>
<p>Also noch eine Klasse erstellen? Ohh, mann. Es hat zwar nur 2 Tage gedauert, das Konzept zu erlernen, anzuwenden und die Liste zu erstellen, aber ich habe schon jetzt wenig Lust, mich noch mal dranzusetzten. Vielleicht morgen oder so... schliesslich habe ich noch frei. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757274</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Sat, 08 Aug 2009 09:32:30 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Sat, 08 Aug 2009 10:37:47 GMT]]></title><description><![CDATA[<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<p>Problem ist: ich weiss nicht mal, WIE aus meinem schnöden Code eine binäre DLL wird.</p>
</blockquote>
<p>Eine DLL erstellst du in Visual Studio, indem du einfach bei dem Projekt den gewünschten &quot;Konfigurationstyp&quot; angibst. Das geht bei den Eigenschaften des Projekts unter &quot;Allgemein&quot; - jedenfalls bei VS 2005, das ich gerade vor mir habe.</p>
<p>Du musst allerdings nicht nur dafür sorgen, dass deine Klassen und Funktionen aus der DLL exportiert werden (mit __declspec(dllexport)), sondern dass andere Binaries diese auch wieder importieren (mit __declspec(dllimport)). Die Klassen und Funktionen müssen also verschieden deklariert sein, je nachdem, ob sie beim Bauen der DLL selbst oder beim Bauen eines anderen Binaries gelesen werden.</p>
<p>Ich verwende dazu eine Lösung, die mit VS und MinGW funktioniert:</p>
<pre><code class="language-cpp">// --- MyClass.hpp

#ifdef MYDLL_EXPORTS
   #undef EXPORT_IMPORT
   #define EXPORT_IMPORT __declspec(dllexport)
#else
   #undef EXPORT_IMPORT
   #define EXPORT_IMPORT __declspec(dllimport)
#endif

class EXPORT_IMPORT MyClass {

   // ...

};

void EXPORT_IMPORT myFunction();
</code></pre>
<p>Jetzt muss in den Einstellungen zum Projekt, das MyDll.dll baut noch das Makro MYDLL_EXPORTS definiert sein (und in den importierenden Binaries ist es natürlich nicht definiert!). Dann klappts auch mit der DLL.</p>
<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<p>4. Ich weiss auch nicht. Vielleicht mag ich es nicht, die Werkzeuge fremder MEnschen zu nutzen, deren Code ich (noch nicht) verstehe. Solange ich jedoch nicht den Durchblick habe, werde ich schön die Finger davon lassen.</p>
</blockquote>
<p>Diese Einstellung ist für Anfänger vielleicht lobenswert. Da lernt man halt was. Allerdings führt sie auch dazu, dass du viele Dinge halt nicht verwenden kannst, die andere schon sehr gut erledigt haben. Zum Beispiel hindert es dich daran, die STL zu verwenden. Oder Boost. Oder sonst eine Library.</p>
<p>Vielleicht solltest du diese Haltung noch einmal überdenken?</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757304</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Sat, 08 Aug 2009 10:37:47 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Sat, 08 Aug 2009 11:21:21 GMT]]></title><description><![CDATA[<p>Mo-mo-mo-mo-moment! Wie ist das zu verstehen?</p>
<p>Also erst mal ein neues Projekt, Anwendungstyp DLL. So war's doch, oder?</p>
<p>Da ich eine neue DLL ohne alte Funktionen erstellen will, muss ich dllexport verwenden, da so neue Funktionen hinzugefügt werden.</p>
<p>Zuerst Header erstellen, Deklarationen hinzufügen (damit man auf die Liste zugreifen kann), dann Funktionen definieren und ein Schutzmakro einbinden. Anschliessend kompilieren.</p>
<p>Korrigiere mich, wenn ich falsch liege. Aber was ich da hingeschrieben habe, ist sozusagen MEIN EIGENER Maschinencode. Einfache Anweisungen, das ist meine Art zu denken.</p>
<p>Und was die STL angeht: Ich habe vor, ein guter - ich meine ein WIRKLICH guter - Programmierer zu werden. Aber wenn ich nur den einfachen Weg gehe und mich nie mit der Interna der STL einlasse, werde ich es auch zu nichts bringen. Dazu will ich auch sagen, dass ich erst 18 bin und vor einem Jahr mit C++ angefangen habe, und ich habe die Befürchtung, dass ich den Anschluss verpassen könnte, DESHALB nehme ich den harten Weg und beschäftige mich mit Speicherverwaltung, dynamischen Arrays und komplexen Listen (denn komplexen ist die ganze Matrix schon). Und nur, wenn ich ABSOLUT nicht klarkomme (wie zum Beispiel mit selbstprogrammierten streams), greife ich auf Hilfe von Ausserhalb zu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757331</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Sat, 08 Aug 2009 11:21:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Sat, 08 Aug 2009 12:08:55 GMT]]></title><description><![CDATA[<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<p>Also erst mal ein neues Projekt, Anwendungstyp DLL. So war's doch, oder?</p>
</blockquote>
<p>Ja.</p>
<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<p>Da ich eine neue DLL ohne alte Funktionen erstellen will, muss ich dllexport verwenden, da so neue Funktionen hinzugefügt werden.</p>
</blockquote>
<p>Das verstehe ich nicht ganz. Du musst Funktionen usw. als &quot;dllexport&quot; deklarieren, damit sie von außerhalb der DLL verfügbar werden. Sonst kannst du die DLL ja gar nicht benutzen. War es das, was du meintest?</p>
<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<p>Zuerst Header erstellen, Deklarationen hinzufügen (damit man auf die Liste zugreifen kann), dann Funktionen definieren und ein Schutzmakro einbinden. Anschliessend kompilieren.</p>
</blockquote>
<p>Im Prinzip ja. Bitte beachte aber, dass im Falle von Templates *kein* &quot;dllexport&quot; verwendet werden darf. Hier sind ja die Definitionen bereits im Header vorhanden und es wird überhaupt kein Code für die DLL erzeugt.</p>
<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<p>Und was die STL angeht: Ich habe vor, ein guter - ich meine ein WIRKLICH guter - Programmierer zu werden. Aber wenn ich nur den einfachen Weg gehe und mich nie mit der Interna der STL einlasse, werde ich es auch zu nichts bringen. Dazu will ich auch sagen, dass ich erst 18 bin und vor einem Jahr mit C++ angefangen habe, und ich habe die Befürchtung, dass ich den Anschluss verpassen könnte, DESHALB nehme ich den harten Weg und beschäftige mich mit Speicherverwaltung, dynamischen Arrays und komplexen Listen (denn komplexen ist die ganze Matrix schon). Und nur, wenn ich ABSOLUT nicht klarkomme (wie zum Beispiel mit selbstprogrammierten streams), greife ich auf Hilfe von Ausserhalb zu.</p>
</blockquote>
<p>Ich möchte dich keineswegs davon abbringen, Dinge verstehen zu wollen, die du verwendest! Und Algorithmen und Datenstrukturen zu verstehen, gehört sicherlich dazu, ein guter Programmierer zu sein.</p>
<p>Bloß klang dein Beitrag so, als wolltest du <strong>gar nichts</strong> verwenden, das du nicht vorher verstanden hast. Und das erschien mir ein Bischen zu viel des Guten. Mehr wollte ich gar nicht sagen. Ein guter Programmierer versteht sich nämlich auch auf die Kunst, gute Dinge wieder zu verwenden. Damit er sein Ziel nicht aus den Augen verliert...</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757342</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Sat, 08 Aug 2009 12:08:55 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Sat, 08 Aug 2009 12:29:26 GMT]]></title><description><![CDATA[<p>DStefan schrieb:</p>
<blockquote>
<p>Das verstehe ich nicht ganz. Du musst Funktionen usw. als &quot;dllexport&quot; deklarieren, damit sie von außerhalb der DLL verfügbar werden. Sonst kannst du die DLL ja gar nicht benutzen. War es das, was du meintest?</p>
</blockquote>
<p>Bingo! Genau das. In der Header muss die Deklaration + __declspec(dllexport) stehen. Im DLL-Projekt muss dann die Header eingebunden sein, dann kann man die Funktionen definieren, oder?</p>
<p>DStefan schrieb:</p>
<blockquote>
<p>Im Prinzip ja. Bitte beachte aber, dass im Falle von Templates *kein* &quot;dllexport&quot; verwendet werden darf. Hier sind ja die Definitionen bereits im Header vorhanden und es wird überhaupt kein Code für die DLL erzeugt.</p>
</blockquote>
<p>Für Templates fällt die DLL ins Wasser. Aber was ist mit statischen Bibliotheken?</p>
<p>DStefan schrieb:</p>
<blockquote>
<p>Ich möchte dich keineswegs davon abbringen, Dinge verstehen zu wollen, die du verwendest! Und Algorithmen und Datenstrukturen zu verstehen, gehört sicherlich dazu, ein guter Programmierer zu sein.</p>
<p>Bloß klang dein Beitrag so, als wolltest du <strong>gar nichts</strong> verwenden, das du nicht vorher verstanden hast. Und das erschien mir ein Bischen zu viel des Guten. Mehr wollte ich gar nicht sagen. Ein guter Programmierer versteht sich nämlich auch auf die Kunst, gute Dinge wieder zu verwenden. Damit er sein Ziel nicht aus den Augen verliert...</p>
</blockquote>
<p>Klar, sonst wären Vererbung, Templates und RTTI wohl verschwendet, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757353</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Sat, 08 Aug 2009 12:29:26 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Sat, 08 Aug 2009 13:19:53 GMT]]></title><description><![CDATA[<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<p>Für Templates fällt die DLL ins Wasser. Aber was ist mit statischen Bibliotheken?</p>
</blockquote>
<p>Dieselbe Antwort. DLLs enthalten fertig übersetzten Code, der unmittelbar ausgeführt wird, wenn man die jeweilige Funktion aufruft.</p>
<p>Im Falle von Templates (und so lange dein Compiler nicht das Keyword &quot;export&quot; unterstützt) wird der Code eines Templates am Ort der Verwendung/Instanziierung erzeugt. Das ist nicht ganz dasselbe wie inline aber so ähnlich.</p>
<p>Also kann man aus Templates keine DLLs erzeugen.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757381</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Sat, 08 Aug 2009 13:19:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Sat, 08 Aug 2009 13:24:05 GMT]]></title><description><![CDATA[<p>Aber mein Compiler unterstützt &quot;export&quot;. Nur weiss ich nicht, was mir das bringt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757384</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Sat, 08 Aug 2009 13:24:05 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Sat, 08 Aug 2009 13:36:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Aber mein Compiler unterstützt &quot;export&quot;.</p>
</blockquote>
<p>Aus deinem Post kann man erkennen, dass du Visual C++ nutzt und das unterstützt export nicht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757391</guid><dc:creator><![CDATA[JustAnotherNoob]]></dc:creator><pubDate>Sat, 08 Aug 2009 13:36:33 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Tue, 11 Aug 2009 07:36:53 GMT]]></title><description><![CDATA[<p>Stimmt. Da habe ich einen Anweisung verwechselt.</p>
<p>Also, entweder bin ich zu blöd dafür, oder mein Compiler hasst mich (was gut sein kann, da er sich immer aufhängt, wenn ich mit der rechten Maustaste klicke), um DLLs zu erstellen. Ich habe eine Klasse, die ... aber seht selbst:</p>
<pre><code class="language-cpp">// Headerdatei SimpleClassDLL.h //

#pragma once

#ifndef _SIMPLECLASSDLL_H
#define _SIMPLECLASSDLL_H

#include &lt;iostream&gt;
using std::cout;
using std::endl;

class CSimpleClass
{
public:
    void __declspec(dllexport) Hello();
    void __declspec(dllexport) Bye();
};

#endif

// Quellcodedatei SimpleClassDLL.cpp //

#include &quot;SimpleClassDLL.h&quot;

void CSimpleClass::Hello()
{
    cout&lt;&lt;&quot;Hallo!&quot;&lt;&lt;endl;
}

void CSimpleClass::Bye()
{
    cout&lt;&lt;&quot;Auf Wiedersehen!&quot;&lt;&lt;endl;
}
</code></pre>
<p>Hier existeren zwei Dateien: SimpleClassDLL.h, die die Deklaration der Klasse vornimmt, und SimpleClassDLL.cpp, die die beiden einzigen Funktionen der Klasse definiert. Ich kompiliere meinen Code und heraus kommt eine DLL von ungefähr 37 KB Größe. Dann will ich meine Funktionen in einem anderen Projekt unterbringen. Dazu kopiere ich den Header der Klasse und die DLL in den Projektodner und binde dann die Headerdatei ein:</p>
<pre><code class="language-cpp">// Ein anderes Projekt, Main.cpp //

#include &quot;SimpleClassDLL.h&quot;

int main()
{
    CSimpleClass SC;
    SC.Hello();
    SC.Bye();
    cin.get();
    return 0;
}
</code></pre>
<p>Hier wird die neue Klasse eingebunden, eine Instanz erstellt und die beiden Funktionen der Klasse aufgerufen. Nein, das heisst, sie SOLLEN aufgerufen werden, aber mein Linker quaselt was von wegen &quot;nichtaufgelöstem extenem Symbol&quot; (es heisst immer, Laufzeitfehler seien die schlimmsten Fehler, aber ich denke, Linkerfehler können einen in den Wahnsinn treiben). Kann mir jemand verraten, was ich falsch mache?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758620</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Tue, 11 Aug 2009 07:36:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Tue, 11 Aug 2009 07:46:52 GMT]]></title><description><![CDATA[<p>1. Du musst die gesamte Klasse exportieren (dllexport nach &quot;class&quot;).</p>
<p>2. Du musst in dem Projekt, welches die DLL benutzt die Klasse auch wieder IMportieren - wie Du das am besten machst, ohne zwei Header für dieselbe Klasse zu erzeugen, hat DStefan schön beschrieben.</p>
<p>3. Beim Erstellungsprozess der DLL wird eine LIB-Datei erzeugt. Diese musst Du beim nutzenden Projekt einbinden, damit die undefined references des Linkers befriedigt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758623</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 11 Aug 2009 07:46:52 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Tue, 11 Aug 2009 07:51:24 GMT]]></title><description><![CDATA[<p>Also ...</p>
<p>Erstens:</p>
<pre><code class="language-cpp">class __declspec(dllexport) CSimpleClass{/*...*/};
</code></pre>
<p>Zweitens (nach der Erstellung der DLL):</p>
<pre><code class="language-cpp">class __declspec(dllimport) CSimpleClass{/*...*/};
</code></pre>
<p>Drittens: Die .LIB mitkopieren. Richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758625</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Tue, 11 Aug 2009 07:51:24 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Tue, 11 Aug 2009 07:52:53 GMT]]></title><description><![CDATA[<p>1./2. Ja, wobei Du die Datei nicht ändern musst. Lies den Beitrag von DStefan nochmal <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>
<p>3. Ja, und in den Projektoptionen bei &quot;zusätzliche Linkerabhängigkeiten&quot; eintragen, oder (ein MSVC-Konstrukt), in die Headerdatei folgendes schreiben:</p>
<pre><code class="language-cpp">#pragma comment(lib,&quot;dllname.lib&quot;)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1758626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758626</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 11 Aug 2009 07:52:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Tue, 11 Aug 2009 07:54:50 GMT]]></title><description><![CDATA[<p>Den habe ich bereits gelesen :D.<br />
OK, wird noch heute ausprobiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758628</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Tue, 11 Aug 2009 07:54:50 GMT</pubDate></item><item><title><![CDATA[Reply to Kreuz und quer durch C++, alles ist dabei ... on Tue, 11 Aug 2009 08:42:02 GMT]]></title><description><![CDATA[<p>Davon abgesehen: Alles was mit Bibliothekten etc. zu tun hat, ist kein ANSI C++ (Der Thread gehört eher in &quot;MFC (Visual C++)&quot;). Es gibt keine dll &amp; ähnliches in ANSI C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758662</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 11 Aug 2009 08:42:02 GMT</pubDate></item></channel></rss>