<?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[Codeteile per Flag austauschen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich arbeite zur Zeit in meiner dll mit zwei verschiedenen APIs, die jeweils vom Anwender ein bzw. ausgeschaltet werden können. Dafür habe ich im Code defines gesetzt, die für die jeweilige API greifen.</p>
<pre><code>#ifdef X
... doXStuff
#elif Y
... doYStuff
#endif
</code></pre>
<p>Das Problem ist jetzt, dass je nachdem die eine oder andere lib gelinkt wird und ich das natürlich nur im Header machen kann, da ja der cpp source sonst nich gelinkt werden könnte.</p>
<p>Jetzt habe folgende Überlegungen angestellt, wenn ich das per interface gestalte, schließt das ein, dass der Anwender irgendwo eigene implementierungen machen muss, fällt daher also weg.</p>
<p>Die defibition im header ist das naheliegenste, bläht diesen aber auch ziemlich mit funktionsimplementierung auf.</p>
<p>Die dritte möglichkeit, die mir spontan einfällt setzt auf abstrakte Funktionspointer, die je nach situation gebunden werden, Nachteil hier ist aber auch, dass dies zusätzlich Zeit frisst und es sein kann, da die funktionspointer nicht linear sind, dass bei der ein oder anderen api funktionen ungenutzt weil eben falsch aufgebaut sind.</p>
<p>Eine andere Möglichkeit bei der ich nicht weiß ob das so funktioniert wäre eine templatelösung. Wenn ich das richtig verstanden habe, müsste der compiler für das template eine eigene klasse erzeugen und separat linken. Wenn ich die kritischen methoden in einem cpp file für das template definiere, erzeugt der compiler dann auch ohne das lib file gültigen funktionscode?<br />
Wenn ich das template dann verwende müsste er doch den code aus dem template obj mit der im projekt eingebundenen api linken oder?</p>
<p>gibt es für das problem villeicht andere Ansätze bei der ich code in der dll ohne lib file trotzdem linken kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/319367/codeteile-per-flag-austauschen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Jul 2026 20:12:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319367.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 15 Aug 2013 21:34:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Codeteile per Flag austauschen on Thu, 15 Aug 2013 21:34:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich arbeite zur Zeit in meiner dll mit zwei verschiedenen APIs, die jeweils vom Anwender ein bzw. ausgeschaltet werden können. Dafür habe ich im Code defines gesetzt, die für die jeweilige API greifen.</p>
<pre><code>#ifdef X
... doXStuff
#elif Y
... doYStuff
#endif
</code></pre>
<p>Das Problem ist jetzt, dass je nachdem die eine oder andere lib gelinkt wird und ich das natürlich nur im Header machen kann, da ja der cpp source sonst nich gelinkt werden könnte.</p>
<p>Jetzt habe folgende Überlegungen angestellt, wenn ich das per interface gestalte, schließt das ein, dass der Anwender irgendwo eigene implementierungen machen muss, fällt daher also weg.</p>
<p>Die defibition im header ist das naheliegenste, bläht diesen aber auch ziemlich mit funktionsimplementierung auf.</p>
<p>Die dritte möglichkeit, die mir spontan einfällt setzt auf abstrakte Funktionspointer, die je nach situation gebunden werden, Nachteil hier ist aber auch, dass dies zusätzlich Zeit frisst und es sein kann, da die funktionspointer nicht linear sind, dass bei der ein oder anderen api funktionen ungenutzt weil eben falsch aufgebaut sind.</p>
<p>Eine andere Möglichkeit bei der ich nicht weiß ob das so funktioniert wäre eine templatelösung. Wenn ich das richtig verstanden habe, müsste der compiler für das template eine eigene klasse erzeugen und separat linken. Wenn ich die kritischen methoden in einem cpp file für das template definiere, erzeugt der compiler dann auch ohne das lib file gültigen funktionscode?<br />
Wenn ich das template dann verwende müsste er doch den code aus dem template obj mit der im projekt eingebundenen api linken oder?</p>
<p>gibt es für das problem villeicht andere Ansätze bei der ich code in der dll ohne lib file trotzdem linken kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346213</guid><dc:creator><![CDATA[Pria]]></dc:creator><pubDate>Thu, 15 Aug 2013 21:34:17 GMT</pubDate></item><item><title><![CDATA[Reply to Codeteile per Flag austauschen on Thu, 15 Aug 2013 21:40:11 GMT]]></title><description><![CDATA[<blockquote>
<p>jeweils vom Anwender</p>
</blockquote>
<p>Wer ist der Anwender? Jemand, der deinen Code uebersetzt, linkt oder nur deine DLL benutzt?</p>
<blockquote>
<p>Nachteil hier ist aber auch, dass dies zusätzlich Zeit frisst und es sein kann</p>
</blockquote>
<p>Ja, aber nur einmal.</p>
<blockquote>
<p>da die funktionspointer nicht linear sind</p>
</blockquote>
<p>Aeh?</p>
<blockquote>
<p>gibt es für das problem villeicht andere Ansätze bei der ich code in der dll ohne lib file trotzdem linken kann?</p>
</blockquote>
<p>Ja, nennt sich LoadLibrary <a href="http://msdn.microsoft.com/de-de/library/ms686944(v=vs.85).aspx" rel="nofollow">http://msdn.microsoft.com/de-de/library/ms686944(v=vs.85).aspx</a> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346214</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 15 Aug 2013 21:40:11 GMT</pubDate></item><item><title><![CDATA[Reply to Codeteile per Flag austauschen on Thu, 15 Aug 2013 22:43:25 GMT]]></title><description><![CDATA[<p>Wie siehts mit einer forward declaration dll-&gt;app aus?</p>
<pre><code>//dll
//test.h

void funcX();

class test
{
  public:
    void useFuncX();
}

//cpp

void test::useFuncX()
{
   funcX();
}
</code></pre>
<pre><code>//app

#include &lt;header_declaring_funcx.h&gt;
#include &lt;test.h&gt;

main()
{
  test().useFuncX();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2346221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346221</guid><dc:creator><![CDATA[Pria]]></dc:creator><pubDate>Thu, 15 Aug 2013 22:43:25 GMT</pubDate></item><item><title><![CDATA[Reply to Codeteile per Flag austauschen on Fri, 16 Aug 2013 07:10:11 GMT]]></title><description><![CDATA[<blockquote>
<p>ich arbeite zur Zeit in meiner dll mit zwei verschiedenen APIs, die jeweils vom Anwender ein bzw. ausgeschaltet werden können.</p>
</blockquote>
<p>Meinst du so was?</p>
<pre><code>// Die Klasse tVisualisiationDevice entspricht einem Interface für beide API's,
// welche nur die zusammengefassten Funktionen deklariert.
class tVisualisiationDevice
{
public:
  virtual void InitDevice();
  virtual void ReleaseDevice();
  virtual void DrawLine();
};

// Implementierung von tVisualisiationDevice auf DirectX
class tDirectXDevice : public tVisualisiationDevice
{
public:
  void InitDevice() {}

  void ReleaseDevice()  {}

  void DrawLine()  {}
};

// Implementierung von tVisualisiationDevice auf OpenGL
class tOpenGLDevice : public tVisualisiationDevice
{
public:
  void InitDevice() {}

  void ReleaseDevice()  {}

  void DrawLine()  {}
};

tVisualisiationDevice* VisDevice = nullptr;  // Ist nicht schön aber für Demo Zwecke genügt es

// DLL Funktion zum Umstellen der Visualisierung auf DirectX
void SetDirectX()
{
  if (VisDevice != nullptr)
  {
    VisDevice-&gt;Release();
    delete VisDevice;
  }
  VisDevice = new tDirectXDevice();
  VisDevice-&gt;InitDevice(); 
}

// DLL Funktion zum Umstellen der Visualisierung auf OpenGL
void SetOpenGL()
{
  if (VisDevice != nullptr)
  {
    VisDevice-&gt;Release();
    delete VisDevice;
  }
  VisDevice = new tOpenGLDevice();
  VisDevice-&gt;InitDevice(); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2346243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346243</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Fri, 16 Aug 2013 07:10:11 GMT</pubDate></item><item><title><![CDATA[Reply to Codeteile per Flag austauschen on Fri, 16 Aug 2013 07:18:31 GMT]]></title><description><![CDATA[<p>Pria schrieb:</p>
<blockquote>
<p>Die dritte möglichkeit, die mir spontan einfällt setzt auf abstrakte Funktionspointer, die je nach situation gebunden werden,</p>
</blockquote>
<p>Lass die Finger von Funktionspointern, das ist C und nicht C++ und schon gar nicht OOP.</p>
<p>Pria schrieb:</p>
<blockquote>
<p>Nachteil hier ist aber auch, dass dies zusätzlich Zeit frisst</p>
</blockquote>
<p>Programm/Datendesign anhand vermeintlicher oder tatsächlicher Nanosekundenoptimierungen vorzunehmen, ist immer schlecht.</p>
<p>Pria schrieb:</p>
<blockquote>
<p>und es sein kann, da die funktionspointer nicht linear sind, dass bei der ein oder anderen api funktionen ungenutzt weil eben falsch aufgebaut sind.</p>
</blockquote>
<p>Was sind &quot;nichtlineare&quot; Funktionspointer?<br />
Was sind &quot;falsch aufgebaute&quot; api funktionen?</p>
<p>Nutze Vererbung, da hast automatisch Codewiederverwendung;<br />
es wird immer alles gelinkt, zur Laufzeit erzeugst du dann eine Instanz der jeweils gewünschten Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346247</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Fri, 16 Aug 2013 07:18:31 GMT</pubDate></item><item><title><![CDATA[Reply to Codeteile per Flag austauschen on Fri, 16 Aug 2013 11:28:10 GMT]]></title><description><![CDATA[<p>Wutz schrieb:</p>
<blockquote>
<p>Was sind &quot;nichtlineare&quot; Funktionspointer?<br />
Was sind &quot;falsch aufgebaute&quot; api funktionen?</p>
</blockquote>
<pre><code>typedef int (*ptr) (int x, int y);

int SomeFunc(int x, int y); //&lt;- mapping möglich
int SomeFunc2(float x, int y, float z); //&lt;- zu viele parameter, mappen nicht möglich
</code></pre>
<p>Wutz schrieb:</p>
<blockquote>
<p>Nutze Vererbung, da hast automatisch Codewiederverwendung;<br />
es wird immer alles gelinkt, zur Laufzeit erzeugst du dann eine Instanz der jeweils gewünschten Klasse.</p>
</blockquote>
<p>Dann tritt hier wieder das Problem auf, entweder binde ich alle header und libs in die dll ein oder der anwender muss eine entsprechende implementierung basteln?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346345</guid><dc:creator><![CDATA[Pria]]></dc:creator><pubDate>Fri, 16 Aug 2013 11:28:10 GMT</pubDate></item><item><title><![CDATA[Reply to Codeteile per Flag austauschen on Fri, 16 Aug 2013 11:32:50 GMT]]></title><description><![CDATA[<p>Pria schrieb:</p>
<blockquote>
<p>Wutz schrieb:</p>
<blockquote>
<p>Was sind &quot;nichtlineare&quot; Funktionspointer?<br />
Was sind &quot;falsch aufgebaute&quot; api funktionen?</p>
</blockquote>
<pre><code>typedef int (*ptr) (int x, int y);

int SomeFunc(int x, int y); //&lt;- mapping möglich
int SomeFunc2(float x, int y, float z); //&lt;- zu viele parameter, mappen nicht möglich
</code></pre>
</blockquote>
<p>Es gibt seit C++11 sowas wie std::function und std::bind, solltest du dir vielleicht mal anschauen. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2346349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346349</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 16 Aug 2013 11:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Codeteile per Flag austauschen on Fri, 16 Aug 2013 11:33:34 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>std::function</p>
</blockquote>
<p>aka Vererbung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346350</guid><dc:creator><![CDATA[oops]]></dc:creator><pubDate>Fri, 16 Aug 2013 11:33:34 GMT</pubDate></item><item><title><![CDATA[Reply to Codeteile per Flag austauschen on Fri, 16 Aug 2013 12:21:02 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20509">@Pria</a>:<br />
Ich verstehe dein Problem nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Willst du in deiner DLL abhängig von einem Präprozessorflag die API namens A oder die API namens B nutzen? Soll der Benutzer selbst dies kompilieren können?</p>
<p>Oder willst du eine DLL mit Nutzung von A und eine DLL mit Nutzung von B generieren? Und der Benutzer wählt anhand der DLL was er haben möchte.</p>
<p>Oder willst du eine DLL schreiben welche die API's über DLLs anspricht und diese je nach Gegenheit nutzt? Wir kämen dann Richtung <a href="http://de.wikipedia.org/wiki/Component_Object_Model" rel="nofollow">COM</a>.</p>
<p>Was möchtest du denn gerne machen?</p>
<p>Skizziere doch mal ein kleines Beispiel!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346382</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Fri, 16 Aug 2013 12:21:02 GMT</pubDate></item></channel></rss>