<?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[Verschachtelte Makros]]></title><description><![CDATA[<p>Hallo,</p>
<p>um tonnenweise Boilerplate-Code zu vermeiden, lasse ich mir ihn von Makros erzeugen. Beispielsweise so:</p>
<pre><code>xyzLIB_DEFINE_BINARY_VALARRAY_TEMPLATE(PolyGamma, T, unsigned, typename T);
</code></pre>
<p>Die Parameter des Makros sind: der Funktionsname, die beiden Argumente und der Template-Parameter. Nun möchte ich aber alle integralen Typen zulassen und nicht nur <code>unsigned</code> . Ok, das dürfte schnell gehen:</p>
<pre><code>xyzLIB_DEFINE_BINARY_VALARRAY_TEMPLATE(PolyGamma, T, U, typename T, typename U);
</code></pre>
<p>Uups, doch nicht! Der neue Template-Parameter wird als Makro-Parameter interpretiert. Klammern gehen auch nicht da Template-Parameterliste. Ok, dann hab ich einen Hack gefunden:</p>
<pre><code>#define xyzLIB_ID_2(x, y) x, y
xyzLIB_DEFINE_BINARY_VALARRAY_TEMPLATE(PolyGamma, T, U, xyzLIB_ID_2(typename T, typename U));
</code></pre>
<p>Und hier meldet sich meine Unwissenheit, ob der Code denn standardkonform ist oder nicht. Bearbeitet der Präprozessor den Code solange bis er keine Symbole mehr findet? Und ist garantiert, dass das äussere Makro vor dem inneren ersetzt wird? Ich hätte es eigentich mit Variadic Macros und <code>__VA_ARGS__</code> machen können, will meine Bibliothek noch kompatibel zu C++03 halten.</p>
<p>Danke im Voraus und Gruss.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327808/verschachtelte-makros</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 23:53:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327808.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Sep 2014 08:42:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verschachtelte Makros on Fri, 05 Sep 2014 09:10:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>um tonnenweise Boilerplate-Code zu vermeiden, lasse ich mir ihn von Makros erzeugen. Beispielsweise so:</p>
<pre><code>xyzLIB_DEFINE_BINARY_VALARRAY_TEMPLATE(PolyGamma, T, unsigned, typename T);
</code></pre>
<p>Die Parameter des Makros sind: der Funktionsname, die beiden Argumente und der Template-Parameter. Nun möchte ich aber alle integralen Typen zulassen und nicht nur <code>unsigned</code> . Ok, das dürfte schnell gehen:</p>
<pre><code>xyzLIB_DEFINE_BINARY_VALARRAY_TEMPLATE(PolyGamma, T, U, typename T, typename U);
</code></pre>
<p>Uups, doch nicht! Der neue Template-Parameter wird als Makro-Parameter interpretiert. Klammern gehen auch nicht da Template-Parameterliste. Ok, dann hab ich einen Hack gefunden:</p>
<pre><code>#define xyzLIB_ID_2(x, y) x, y
xyzLIB_DEFINE_BINARY_VALARRAY_TEMPLATE(PolyGamma, T, U, xyzLIB_ID_2(typename T, typename U));
</code></pre>
<p>Und hier meldet sich meine Unwissenheit, ob der Code denn standardkonform ist oder nicht. Bearbeitet der Präprozessor den Code solange bis er keine Symbole mehr findet? Und ist garantiert, dass das äussere Makro vor dem inneren ersetzt wird? Ich hätte es eigentich mit Variadic Macros und <code>__VA_ARGS__</code> machen können, will meine Bibliothek noch kompatibel zu C++03 halten.</p>
<p>Danke im Voraus und Gruss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416184</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Fri, 05 Sep 2014 09:10:30 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte Makros on Fri, 05 Sep 2014 09:08:32 GMT]]></title><description><![CDATA[<blockquote>
<p>Das neue Template-Argument wird als Makro-Parameter interpretiert.</p>
</blockquote>
<p>Argument? Wenn du <code>U</code> meinst - das ist der Template-Parameter. Und warum kannst du nicht einfach den Namen zu <code>V</code> ändern?</p>
<p>Ich bin ein wenig verwirrt. Kannst du ein klitzekleines Testprogramm posten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416192</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 05 Sep 2014 09:08:32 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte Makros on Fri, 05 Sep 2014 09:16:07 GMT]]></title><description><![CDATA[<p>Oh, natürlich der Template-Parameter, nicht das Argument (also <code>typename U</code> ). Hab's im OP angepasst.</p>
<p>Edit:<br />
Hier der Code (der auskommentierte Teil ist der, der nicht geht):</p>
<pre><code>#define GEN(Fun, Ret, Arg1, Arg2, TemplateArgs)	\
template&lt;TemplateArgs&gt;	                        \
Ret Fun(Arg1, Arg2)		                        \
{						                        \
	return Ret();                               \
}

GEN(f, int, T, T, typename T);
// GEN(g, int, T, U, typename T, typename U);

int main()
{
	f(5, 7);
	// g(5, 7.);
}
</code></pre>
<p><a href="http://ideone.com/KZmUSx" rel="nofollow">http://ideone.com/KZmUSx</a></p>
<p>Und hier mein fragwürdiger Hack:</p>
<pre><code>#define GEN(Fun, Ret, Arg1, Arg2, TemplateArgs)	\
template&lt;TemplateArgs&gt;	                        \
Ret Fun(Arg1, Arg2)		                        \
{						                        \
	return Ret();                               \
}

#define Id2(x, y) x, y

GEN(f, int, T, T, typename T);
GEN(g, int, T, U, Id2(typename T, typename U));

int main()
{
	f(5, 7);
	g(5, 7.);
}
</code></pre>
<p><a href="http://ideone.com/KXLPym" rel="nofollow">http://ideone.com/KXLPym</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416194</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Fri, 05 Sep 2014 09:16:07 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte Makros on Fri, 05 Sep 2014 09:33:57 GMT]]></title><description><![CDATA[<p><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="😃"
    /><br />
Ja, das ist absolut in Ordnung und standardkonform.</p>
<blockquote>
<p>Und ist garantiert, dass das äussere Makro vor dem inneren ersetzt wird?</p>
</blockquote>
<p>Nein, andersherum:</p>
<p>[cpp.subst]/1 schrieb:</p>
<blockquote>
<p>A parameter in the replacement list […] is replaced by the corresponding argument <strong>after all macros contained therein have been expanded</strong>.</p>
</blockquote>
<p>Es wird also <code>Id2(typename T, typename U)</code> expandiert. Das ergibt die pp-tokens <code>typename T, typename U</code> . Und dann wird in der replacement list von <code>GEN</code>  <code>TemplateArgs</code> durch diese pp-tokens ersetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416200</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 05 Sep 2014 09:33:57 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte Makros on Fri, 05 Sep 2014 09:41:27 GMT]]></title><description><![CDATA[<p>Ah, ich verstehe. Gut, danke. <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/2416202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416202</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Fri, 05 Sep 2014 09:41:27 GMT</pubDate></item></channel></rss>