<?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[Frage zu (etwas konstruiertem) Macro-Problem]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgenden Code:</p>
<pre><code class="language-cpp">#define USE_HEAP

#ifdef USE_HEAP
    #define make_array(Name, size) unsigned *Name = new unsigned[size]
#else
    #define make_array(Name, size) unsigned Name[size]
#endif

//...
make_array(a, 10);
a[0]=1;
//...
</code></pre>
<p>Dabei möchte ich das array mittels eines macros wieder freigeben</p>
<pre><code class="language-cpp">#ifdef USE_HEAP
    #define delete_array(Name) delete [] Name
#else
    #define delete_array(Name) /*Mache Garnichts*/
#endif
</code></pre>
<p>Sodass folgender Code gültig ist, egal ob USE_HEAP definiert ist, oder nicht</p>
<pre><code class="language-cpp">make_array(a, 10);
free_array(a);
</code></pre>
<p>Ich weis, dass es ungefähr der blödsinnigste Weg ist, arrays zu erstellen (besser alles direkt aufn Heap, oder STL (vector) benutzen, oder in template funktionen kapseln...), aber mir geht es hier darum, die Funktionsweise von Macros zu verstehen.<br />
Wie sage ich also &quot;delete_array&quot;, dass es NICHTS machen soll, wenn USE_HEAP nicht definiert ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/276979/frage-zu-etwas-konstruiertem-macro-problem</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 04:22:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/276979.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Nov 2010 23:47:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu (etwas konstruiertem) Macro-Problem on Wed, 10 Nov 2010 23:47:23 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgenden Code:</p>
<pre><code class="language-cpp">#define USE_HEAP

#ifdef USE_HEAP
    #define make_array(Name, size) unsigned *Name = new unsigned[size]
#else
    #define make_array(Name, size) unsigned Name[size]
#endif

//...
make_array(a, 10);
a[0]=1;
//...
</code></pre>
<p>Dabei möchte ich das array mittels eines macros wieder freigeben</p>
<pre><code class="language-cpp">#ifdef USE_HEAP
    #define delete_array(Name) delete [] Name
#else
    #define delete_array(Name) /*Mache Garnichts*/
#endif
</code></pre>
<p>Sodass folgender Code gültig ist, egal ob USE_HEAP definiert ist, oder nicht</p>
<pre><code class="language-cpp">make_array(a, 10);
free_array(a);
</code></pre>
<p>Ich weis, dass es ungefähr der blödsinnigste Weg ist, arrays zu erstellen (besser alles direkt aufn Heap, oder STL (vector) benutzen, oder in template funktionen kapseln...), aber mir geht es hier darum, die Funktionsweise von Macros zu verstehen.<br />
Wie sage ich also &quot;delete_array&quot;, dass es NICHTS machen soll, wenn USE_HEAP nicht definiert ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1978776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1978776</guid><dc:creator><![CDATA[MacroFrage]]></dc:creator><pubDate>Wed, 10 Nov 2010 23:47:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu (etwas konstruiertem) Macro-Problem on Wed, 10 Nov 2010 23:56:27 GMT]]></title><description><![CDATA[<p>Du hast es richtig gemacht.<br />
Beachte, daß es die leere Anweisung</p>
<pre><code class="language-cpp">;
</code></pre>
<p>gibt.<br />
Und Deine Makro-Aufrufe müssen mit ; abgeschlossen werden. So wird aus</p>
<pre><code class="language-cpp">delete_array(foo);
</code></pre>
<p>ganz richtig</p>
<pre><code class="language-cpp">;
</code></pre>
<p>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1978779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1978779</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 10 Nov 2010 23:56:27 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu (etwas konstruiertem) Macro-Problem on Thu, 11 Nov 2010 00:02:45 GMT]]></title><description><![CDATA[<p>Obwohl das Macro ein &quot;Argument&quot; entegennimmt kannes also leer bleiben?<br />
Das wusste ich nicht! Danke Volkard!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1978784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1978784</guid><dc:creator><![CDATA[MacroFrage]]></dc:creator><pubDate>Thu, 11 Nov 2010 00:02:45 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu (etwas konstruiertem) Macro-Problem on Thu, 11 Nov 2010 02:44:54 GMT]]></title><description><![CDATA[<p>Ich habe oft gesehen dass es so gemacht wird:</p>
<pre><code class="language-cpp">#define MACRO_THAT_DOES_NOTHING(x) ((void)0)
</code></pre>
<p>Vielleicht kann mir jmd. erklären was der Vorteil davon ist.<br />
Gibt es mit ein potentielles Problem der &quot;leeren&quot; Version das durch <code>((void)0)</code> gelöst wird?</p>
<p>EDIT: mir is grad selbst ein solches potentielles Problem eingefallen:</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

//#define MACRO_THAT_DOES_NOTHING(x)
#define MACRO_THAT_DOES_NOTHING(x) ((void)0)

int main()
{
	// würde mit der &quot;leeren&quot; Version nicht gehen
	MACRO_THAT_DOES_NOTHING(123), printf(&quot;test&quot;);
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1978789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1978789</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 11 Nov 2010 02:44:54 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu (etwas konstruiertem) Macro-Problem on Thu, 11 Nov 2010 03:03:15 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich habe oft gesehen dass es so gemacht wird:</p>
<pre><code class="language-cpp">MACRO_THAT_DOES_NOTHING(123), printf(&quot;test&quot;);
</code></pre>
</blockquote>
<p>Ja, assert kann das in allen Implementierungen, die ich bisher sah.<br />
Aber ich hab's auch noch nie so verwendet gesehen. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1978794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1978794</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 11 Nov 2010 03:03:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu (etwas konstruiertem) Macro-Problem on Thu, 11 Nov 2010 07:40:39 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich habe oft gesehen dass es so gemacht wird:</p>
<pre><code class="language-cpp">#define MACRO_THAT_DOES_NOTHING(x) ((void)0)
</code></pre>
<p>Vielleicht kann mir jmd. erklären was der Vorteil davon ist.<br />
Gibt es mit ein potentielles Problem der &quot;leeren&quot; Version das durch <code>((void)0)</code> gelöst wird?</p>
</blockquote>
<p>Auch Compiler-Warnungen können hier lästig werden. Man will, dass dies ein Statement ist. View Compiler würden ohne Code (auch wenn er wegoptimiert wird) bei einem if Statement eine Warung auswerfen:</p>
<pre><code class="language-cpp">if (something)
    MACRO_THAT_DOES_NOTHING(x);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1978806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1978806</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 11 Nov 2010 07:40:39 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu (etwas konstruiertem) Macro-Problem on Thu, 11 Nov 2010 09:25:58 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Und Deine Makro-Aufrufe müssen mit ; abgeschlossen werden.</p>
</blockquote>
<p>Würde ich nicht ganz verallgemeinern. Wir verwenden im Projekt z.B. an ein paar Stellen Makros, die, damit sie (Bis auf die Großschreibung) konsistent zu dem restlichen Code &quot;erscheinen&quot; kein &quot;;&quot; enthalten (sondern explizit mit diesem beendet werden).</p>
<p>Ich würde aber auch niemals Makronamen so gestalten wie Funktionsnamen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1978846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1978846</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 11 Nov 2010 09:25:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu (etwas konstruiertem) Macro-Problem on Thu, 11 Nov 2010 09:37:07 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Würde ich nicht ganz verallgemeinern. Wir verwenden im Projekt z.B. an ein paar Stellen Makros, die, damit sie (Bis auf die Großschreibung) konsistent zu dem restlichen Code &quot;erscheinen&quot; kein &quot;;&quot; enthalten (sondern explizit mit diesem beendet werden).</p>
</blockquote>
<p>Natürlich. Never ever ; im Makro. Sonst hat man hier probleme:</p>
<pre><code class="language-cpp">if(foo)
  MAKRO();
else
  bar();
</code></pre>
<p>Aber das meinte Volkard ja auch nicht. Deshalb verwendet man ja den ((void)0) trick. ich habe manchmal auch eine leere Funktion noop() die ich für sowas einsetze...</p>
<blockquote>
<p>Ich würde aber auch niemals Makronamen so gestalten wie Funktionsnamen.</p>
</blockquote>
<p>kommt darauf an. viele makros sind ja normale Funktionen. zB max() in C. Man muss nur auf die Namenskollisionen aufpassen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1978853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1978853</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 11 Nov 2010 09:37:07 GMT</pubDate></item></channel></rss>