<?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[Makro vs. Funktion]]></title><description><![CDATA[<p>Hallo Leute</p>
<p>Weis ned ob das jetzt hier her oder ins WinAPI Forum gehört, aber ich denke, dass man das auch allgemein beantworten kann.<br />
Ich möchte folgendes Makro umschreiben als, von mir aus globale, Funktion:</p>
<pre><code class="language-cpp">#define SAFE_RELEASE(p) { if(p) {(p)-&gt;Release(); (p)=NULL;} }
</code></pre>
<p>Wobei p in der Regel ein Zeiger auf ein COM Object ist. (Wird zB in DirectX oft verwendet)<br />
Nun seh ich zwei mögliche Funktionen:</p>
<pre><code class="language-cpp">//so
safe_release( void* p ) {
    if( p != NULL ) {
        p-&gt;Release();
        p = NULL;
    }
}     
//oder so
safe_release( IUnknown* p ) {
    if( p != NULL ) {
        p-&gt;Release();
        p = NULL;
    }
}
</code></pre>
<p>Ist das überhaupt sinnvoll?<br />
(Oder kommts mir nur so vor, weil ich keine Makros mag..)<br />
Und wenn ja, welche Version würdet ihr vorschlagen?</p>
<p>Wäre um Hilfe und Meinungen froh <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>mfg<br />
Mat</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/149097/makro-vs-funktion</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 04:28:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/149097.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 02 Jun 2006 10:52:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Makro vs. Funktion on Fri, 02 Jun 2006 10:52:15 GMT]]></title><description><![CDATA[<p>Hallo Leute</p>
<p>Weis ned ob das jetzt hier her oder ins WinAPI Forum gehört, aber ich denke, dass man das auch allgemein beantworten kann.<br />
Ich möchte folgendes Makro umschreiben als, von mir aus globale, Funktion:</p>
<pre><code class="language-cpp">#define SAFE_RELEASE(p) { if(p) {(p)-&gt;Release(); (p)=NULL;} }
</code></pre>
<p>Wobei p in der Regel ein Zeiger auf ein COM Object ist. (Wird zB in DirectX oft verwendet)<br />
Nun seh ich zwei mögliche Funktionen:</p>
<pre><code class="language-cpp">//so
safe_release( void* p ) {
    if( p != NULL ) {
        p-&gt;Release();
        p = NULL;
    }
}     
//oder so
safe_release( IUnknown* p ) {
    if( p != NULL ) {
        p-&gt;Release();
        p = NULL;
    }
}
</code></pre>
<p>Ist das überhaupt sinnvoll?<br />
(Oder kommts mir nur so vor, weil ich keine Makros mag..)<br />
Und wenn ja, welche Version würdet ihr vorschlagen?</p>
<p>Wäre um Hilfe und Meinungen froh <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>mfg<br />
Mat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070006</guid><dc:creator><![CDATA[Herby68]]></dc:creator><pubDate>Fri, 02 Jun 2006 10:52:15 GMT</pubDate></item><item><title><![CDATA[Reply to Makro vs. Funktion on Fri, 02 Jun 2006 10:54:41 GMT]]></title><description><![CDATA[<p>Eher so:</p>
<pre><code class="language-cpp">template&lt;typename Ptr&gt;
void safe_release(Ptr*&amp; p) {
  if (p) {
     p-&gt;Release();
     p = 0;
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1070009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070009</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 02 Jun 2006 10:54:41 GMT</pubDate></item><item><title><![CDATA[Reply to Makro vs. Funktion on Fri, 02 Jun 2006 11:06:37 GMT]]></title><description><![CDATA[<p>Hi<br />
und Danke</p>
<p>Hab grad gemerkt dass ich Unsinn geposted hab.<br />
Es geht natürlich nicht mit <em>void</em>,*<br />
denn das Objekt muss ja die virtuelle Methode <em>Release()</em> überschreiben.<br />
Da das ganze nur für COM Objekte benutzt würde, ist wohl die Basisklasse ausreichen,<br />
mit template wärs wohl etwas overdosed und der Aufruf entsprechend aufgeblasen</p>
<pre><code class="language-cpp">safe_release( g_lpD3DDevice );
vs.
safe_release&lt;LPD3DDEVICE&gt;( g_lpD3DDevice );
</code></pre>
<p>mfg<br />
Mat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070019</guid><dc:creator><![CDATA[Herby68]]></dc:creator><pubDate>Fri, 02 Jun 2006 11:06:37 GMT</pubDate></item><item><title><![CDATA[Reply to Makro vs. Funktion on Fri, 02 Jun 2006 11:13:32 GMT]]></title><description><![CDATA[<p>Sorry fürs Doppelpost..</p>
<p>Aber mit &quot;keine Macht den Makros&quot; lieg ich schon richtig oder?<br />
Und wo sollte ich die Funktion reinklatschen, in nen &quot;globalen&quot; Header,<br />
oder jeder Klasse, die COM Objekte ( IUnknown Derivate ) besitzt als Methode übergeben, bzw eine abstrakte Basisklasse zum Kapseln solcher Interfaces machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070023</guid><dc:creator><![CDATA[Herby68]]></dc:creator><pubDate>Fri, 02 Jun 2006 11:13:32 GMT</pubDate></item><item><title><![CDATA[Reply to Makro vs. Funktion on Fri, 02 Jun 2006 11:14:12 GMT]]></title><description><![CDATA[<p>Stimmt nicht, Template-Funktionen können ihre Template-Parameter anhand der Parameter selbst ermitteln.</p>
<p>Allerdings hast Du recht wenn Du sagst dass es über die Basisklasse genauso gut geht (dann vergiss aber nicht den Zeiger als Referenz (IUnknown*&amp;) zu übergeben, sonst hat das p = NULL keinerlei Auswirkung).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070025</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 02 Jun 2006 11:14:12 GMT</pubDate></item><item><title><![CDATA[Reply to Makro vs. Funktion on Fri, 02 Jun 2006 11:20:31 GMT]]></title><description><![CDATA[<p>Besser wäre es einfach boost::intrusive_pointer zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070032</guid><dc:creator><![CDATA[Dr. Prof]]></dc:creator><pubDate>Fri, 02 Jun 2006 11:20:31 GMT</pubDate></item><item><title><![CDATA[Reply to Makro vs. Funktion on Fri, 02 Jun 2006 11:28:42 GMT]]></title><description><![CDATA[<p>Ah so Danke.<br />
Hab bis jetzt nur Template-Klassen genutzt, keine Funktionen, von daher wusst ich das ned.<br />
Aber das mit der Zeiger-Referenz-Übergabe hab ich ganz übersehn. Ist aber im Nachhinein eindeutig klar.<br />
@DrProf: Was machen den die intrusive pointer?</p>
<p>Also was ich im Endeffekt erreichen will, ist, das alle Objekte sauber aufgeräumt werden, egal, wie ich das Programm beende.<br />
Wärs da nicht schlau, eine Art &quot;Mülleimer&quot; zu machen, der als Member eine Liste der COM-Zeiger enthält, und im Destruktor alle mit <em>safe_release();</em> freigibt?</p>
<p>mfg<br />
Mat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070037</guid><dc:creator><![CDATA[Herby68]]></dc:creator><pubDate>Fri, 02 Jun 2006 11:28:42 GMT</pubDate></item><item><title><![CDATA[Reply to Makro vs. Funktion on Fri, 02 Jun 2006 11:34:13 GMT]]></title><description><![CDATA[<p>Ein intrusive_ptr ist ein Smart-Pointer - der kümmert sich selber darum, daß er vor der Vernichtung noch den Speicher freigibt.</p>
<p>(für genauere Erklärungen kannst du z.B. <a href="http://c-plusplus.net/forum/viewtopic-var-t-is-134971.html" rel="nofollow">hier</a> vorbeischauen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070040</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 02 Jun 2006 11:34:13 GMT</pubDate></item><item><title><![CDATA[Reply to Makro vs. Funktion on Fri, 02 Jun 2006 11:50:24 GMT]]></title><description><![CDATA[<p>Hey Danke</p>
<p>Über den Artikel bin ich auf folgenden Artikel bei Codeproject gestossen:<br />
<a href="http://www.codeproject.com/vcpp/stl/boostsp_handleref.asp" rel="nofollow">Kreativer Missbrauch von shared_ptr&lt;T&gt;</a><br />
Ganz interessant, aber doch etwas aufgebläht.<br />
Da versuch ich lieber das ganze sicher genug zu coden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Danke nochmal euch allen</p>
<p>mfg<br />
Mat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070049</guid><dc:creator><![CDATA[Herby68]]></dc:creator><pubDate>Fri, 02 Jun 2006 11:50:24 GMT</pubDate></item><item><title><![CDATA[Reply to Makro vs. Funktion on Fri, 02 Jun 2006 17:44:57 GMT]]></title><description><![CDATA[<p>das mit der referenz hab ich nicht gerafft. der wert (die adresse) wird doch normal ohne referenz einfach kopiert. steht das irgendwo im standard, dass das bei zeigern anders ist? folgender test hat NICHT ergeben, dass der zeiger-wert ohne benutzen einer referenz verändert wird:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

template&lt;typename T&gt;
inline bool isPointerNULL(T *ptr){ return ptr == 0; }

int main()
{
    int *test1 = 0;
    int test2;
    cout &lt;&lt; isPointerNULL(test1) &lt;&lt; endl;
    cout &lt;&lt; isPointerNULL(&amp;test2) &lt;&lt; endl;
}
</code></pre>
<p>hat jemand ein beispiel, dass die notwendigkeit einer referenz unterstreicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070232</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Fri, 02 Jun 2006 17:44:57 GMT</pubDate></item><item><title><![CDATA[Reply to Makro vs. Funktion on Fri, 02 Jun 2006 17:47:54 GMT]]></title><description><![CDATA[<p>sorry, hab nicht richtig gelesen. der pointer wird ja gesetzt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070234</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Fri, 02 Jun 2006 17:47:54 GMT</pubDate></item></channel></rss>