<?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 zum Präprozessor, speziell boost::preprocessor. Makro ruft sich selbst auf?]]></title><description><![CDATA[<p>Hallo,<br />
mal angenommen folgendes Beispiel, das leider so stark vereinfacht ist, dass es gar keinen Sinn mehr macht, aber es geht um's Prinzip:</p>
<pre><code class="language-cpp">#include &lt;boost/preprocessor/cat.hpp&gt;
#include &lt;boost/preprocessor/seq/for_each_i.hpp&gt;

#define SEQ (a)(b)(c)

// Folgendes geht, BOOST_PP_CAT wird ausgewertet:
#define MACRO(r, data, i, elem) BOOST_PP_CAT(elem, BOOST_PP_CAT(data, i))
BOOST_PP_SEQ_FOR_EACH_I(MACRO, _, SEQ) //  wird zu: a_0 b_1 c_2 

// Folgendes geht nicht:
#define INNEN(r, data, elem) hu
#define AUSSEN(r, data, i, elem) BOOST_PP_SEQ_FOR_EACH_I(INNEN, data ,SEQ)
BOOST_PP_SEQ_FOR_EACH_I(AUSSEN, _, SEQ) // soll werden zu: hu hu hu hu hu hu hu hu hu (Neun mal 'hu')

/* Wird stattdessen zu:
BOOST_PP_SEQ_FOR_EACH_I(INNEN, _ ,(a)(b)(c)) BOOST_PP_SEQ_FOR_EACH_I(INNEN, _ ,(a)(b)(c)) BOOST_PP_SEQ_FOR_EACH_I(INNEN, _ ,(a)(b)(c))

Das heißt: BOOST_PP_FOR_EACH_I wird nicht ausgewertet
*/
</code></pre>
<p>Zunächst mal meine Vermutung warum das nicht geht: Weil das Makro sich selbst aufruft.</p>
<p><strong>Frage 1</strong>: Ist das richtig, dass die Verschachtelung von Makros ein Problem ist?<br />
<strong>Frage 2</strong>, falls nein zu <strong>Frage 1</strong>: Was ist dann das Problem?<br />
<strong>Frage 3</strong>, falls ja zu <strong>Frage 1</strong>: Was ist dann mit BOOST_PP_CAT(elem, BOOST_PP_CAT(data, i))?<br />
<strong>Frage 4</strong>, falls ja zu <strong>Frage 1</strong>: Gibt's dafür eine Möglichkeit, trotzdem etwas in der Art zu machen? (Ich meine sowas wie Verschachtelung, dass ich huhuhuhuhu auch anders hinbekomme ist mir klar <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>
<p>Mir fiele die Möglichkeit ein, die ganzen Boost Makros nochmals mit anderem Namen zu definieren und dann für die zweite Schleifenebene die umbenannten Versionen zu benutzen, aber das halte ich für unnötig umständlich.</p>
<p>Oder etwas einfacher, könnte ich meine eigene Version von BOOST_PP_SEQ_FOR_EACH_PRODUCT schreiben, die nicht die Einschränkungen hat, wegen derer ich es nicht verwenden will.</p>
<p>Wie ich gesehen habe verwendet BOOST_PP_SEQ_FOR_EACH_PRODUCT intern keine Verschachtelten Makros, deshalb befürchte ich, dass dies anders wohl nicht geht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p><strong>Frage 5</strong>: Ist boost::preprocessor eigentlich auch &quot;böse&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/245902/frage-zum-präprozessor-speziell-boost-preprocessor-makro-ruft-sich-selbst-auf</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 12:12:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/245902.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 20 Jul 2009 17:31:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zum Präprozessor, speziell boost::preprocessor. Makro ruft sich selbst auf? on Mon, 20 Jul 2009 17:31:55 GMT]]></title><description><![CDATA[<p>Hallo,<br />
mal angenommen folgendes Beispiel, das leider so stark vereinfacht ist, dass es gar keinen Sinn mehr macht, aber es geht um's Prinzip:</p>
<pre><code class="language-cpp">#include &lt;boost/preprocessor/cat.hpp&gt;
#include &lt;boost/preprocessor/seq/for_each_i.hpp&gt;

#define SEQ (a)(b)(c)

// Folgendes geht, BOOST_PP_CAT wird ausgewertet:
#define MACRO(r, data, i, elem) BOOST_PP_CAT(elem, BOOST_PP_CAT(data, i))
BOOST_PP_SEQ_FOR_EACH_I(MACRO, _, SEQ) //  wird zu: a_0 b_1 c_2 

// Folgendes geht nicht:
#define INNEN(r, data, elem) hu
#define AUSSEN(r, data, i, elem) BOOST_PP_SEQ_FOR_EACH_I(INNEN, data ,SEQ)
BOOST_PP_SEQ_FOR_EACH_I(AUSSEN, _, SEQ) // soll werden zu: hu hu hu hu hu hu hu hu hu (Neun mal 'hu')

/* Wird stattdessen zu:
BOOST_PP_SEQ_FOR_EACH_I(INNEN, _ ,(a)(b)(c)) BOOST_PP_SEQ_FOR_EACH_I(INNEN, _ ,(a)(b)(c)) BOOST_PP_SEQ_FOR_EACH_I(INNEN, _ ,(a)(b)(c))

Das heißt: BOOST_PP_FOR_EACH_I wird nicht ausgewertet
*/
</code></pre>
<p>Zunächst mal meine Vermutung warum das nicht geht: Weil das Makro sich selbst aufruft.</p>
<p><strong>Frage 1</strong>: Ist das richtig, dass die Verschachtelung von Makros ein Problem ist?<br />
<strong>Frage 2</strong>, falls nein zu <strong>Frage 1</strong>: Was ist dann das Problem?<br />
<strong>Frage 3</strong>, falls ja zu <strong>Frage 1</strong>: Was ist dann mit BOOST_PP_CAT(elem, BOOST_PP_CAT(data, i))?<br />
<strong>Frage 4</strong>, falls ja zu <strong>Frage 1</strong>: Gibt's dafür eine Möglichkeit, trotzdem etwas in der Art zu machen? (Ich meine sowas wie Verschachtelung, dass ich huhuhuhuhu auch anders hinbekomme ist mir klar <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>
<p>Mir fiele die Möglichkeit ein, die ganzen Boost Makros nochmals mit anderem Namen zu definieren und dann für die zweite Schleifenebene die umbenannten Versionen zu benutzen, aber das halte ich für unnötig umständlich.</p>
<p>Oder etwas einfacher, könnte ich meine eigene Version von BOOST_PP_SEQ_FOR_EACH_PRODUCT schreiben, die nicht die Einschränkungen hat, wegen derer ich es nicht verwenden will.</p>
<p>Wie ich gesehen habe verwendet BOOST_PP_SEQ_FOR_EACH_PRODUCT intern keine Verschachtelten Makros, deshalb befürchte ich, dass dies anders wohl nicht geht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p><strong>Frage 5</strong>: Ist boost::preprocessor eigentlich auch &quot;böse&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1746478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1746478</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 20 Jul 2009 17:31:55 GMT</pubDate></item></channel></rss>