<?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[Variable mit selben Groß und Kleingeschreiben in Macro]]></title><description><![CDATA[<p>Ich habe folgenden Code:</p>
<pre><code>struct FruitBase {std::string name; eFruit::Enum type;};

struct eFruit
{
	enum Enum
	{
		Apple,
		Banana,
		Watermelon,
		Pear
	};
};
</code></pre>
<p>Für jede Frucht gibt es ein struct der Form</p>
<pre><code>template &lt;typename T&gt; struct apple : public FruitBase
{ 
	apple()
	{
		name = &quot;apple&quot;;
		tyoe = eFruit::Apple;
	}

	T value; 
};
</code></pre>
<p>Ich möchte jetzt durch ein Macro den Obigen Code &quot;generieren&quot; - etwa so:</p>
<pre><code>#define MAKE_FRUIT(X) template &lt;typename T&gt; struct X : public FruitBase\
{ \
  X() \
  { \
	name = #X; \
	type = eFruit::X; \
  } \
}

MAKE_FRUIT(apple);
MAKE_FRUIT(banana);
MAKE_FRUIT(watermelon);
MAKE_FRUIT(pear);
</code></pre>
<p>Problem ist jetzt allerdings, dass der name des structs kleingeschrieben werden soll (struct apple) - der wert der Variablen name soll ebenfalls kleingeschreiben sein ( name = &quot;apple&quot;) - aber der Type eFurit::X fängt immer mit einem Großbuchstaben an - (eFruit::Apple)</p>
<p>Gibt es eine Möglichkeit das dem Preprozessor beizubringen - ich verwende auch Boost, d. h. ein Boost Lösung ist auch akzeptabel.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/312622/variable-mit-selben-groß-und-kleingeschreiben-in-macro</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 17:50:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312622.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Jan 2013 16:44:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Wed, 09 Jan 2013 16:44:34 GMT]]></title><description><![CDATA[<p>Ich habe folgenden Code:</p>
<pre><code>struct FruitBase {std::string name; eFruit::Enum type;};

struct eFruit
{
	enum Enum
	{
		Apple,
		Banana,
		Watermelon,
		Pear
	};
};
</code></pre>
<p>Für jede Frucht gibt es ein struct der Form</p>
<pre><code>template &lt;typename T&gt; struct apple : public FruitBase
{ 
	apple()
	{
		name = &quot;apple&quot;;
		tyoe = eFruit::Apple;
	}

	T value; 
};
</code></pre>
<p>Ich möchte jetzt durch ein Macro den Obigen Code &quot;generieren&quot; - etwa so:</p>
<pre><code>#define MAKE_FRUIT(X) template &lt;typename T&gt; struct X : public FruitBase\
{ \
  X() \
  { \
	name = #X; \
	type = eFruit::X; \
  } \
}

MAKE_FRUIT(apple);
MAKE_FRUIT(banana);
MAKE_FRUIT(watermelon);
MAKE_FRUIT(pear);
</code></pre>
<p>Problem ist jetzt allerdings, dass der name des structs kleingeschrieben werden soll (struct apple) - der wert der Variablen name soll ebenfalls kleingeschreiben sein ( name = &quot;apple&quot;) - aber der Type eFurit::X fängt immer mit einem Großbuchstaben an - (eFruit::Apple)</p>
<p>Gibt es eine Möglichkeit das dem Preprozessor beizubringen - ich verwende auch Boost, d. h. ein Boost Lösung ist auch akzeptabel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288000</guid><dc:creator><![CDATA[Agin34]]></dc:creator><pubDate>Wed, 09 Jan 2013 16:44:34 GMT</pubDate></item><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Wed, 09 Jan 2013 16:51:08 GMT]]></title><description><![CDATA[<p>Nicht automatisch, aber es ist möglich.</p>
<pre><code>#define apple_enumerator Apple
#define banana_enumerator Banana

#define FRUIT_ENUMERATOR(fruit) fruit ## _enumerator
</code></pre>
<p>&lt;<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    />&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288002</guid><dc:creator><![CDATA[glühbirne]]></dc:creator><pubDate>Wed, 09 Jan 2013 16:51:08 GMT</pubDate></item><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Wed, 09 Jan 2013 18:24:14 GMT]]></title><description><![CDATA[<p>Lass so einen Spass bleiben. Du verlierst sämtlichen Überblick und dein Code ist schwer zu debuggen und absolut nicht anpassungsfähig, also individualisierbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288027</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 09 Jan 2013 18:24:14 GMT</pubDate></item><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Wed, 09 Jan 2013 19:05:05 GMT]]></title><description><![CDATA[<p>für diejenigen, die den Präprozessor nicht aus ideologischen Gründen ablehnen, geht auch folgendes. das verschachtelte MAKESTR hängt mit der internen Arbeitsweise des Präprozessors zusammen</p>
<pre><code>#define BIG_LETTER_a A
#define BIG_LETTER_b B
#define BIG_LETTER_p P
#define BIG_LETTER_w W

#define BIG_LETTER(X) BIG_LETTER_ ## X

#define MAKESTR_(X) # X
#define MAKESTR(X) MAKESTR_(X)
#define CONC1(X,Y) X ## Y
#define CONC2(X,Y) BIG_LETTER(X) ## Y

struct eFruit
{
    enum Enum
    {
        Apple,
        Banana,
        Watermelon,
        Pear
    };
};

struct FruitBase {std::string name; eFruit::Enum type;};

#define MAKE_FRUIT(X,Y) template &lt;typename T&gt; struct CONC1(X,Y) : public FruitBase \
{ \
  CONC1(X,Y)() \
  { \
    name = MAKESTR(CONC1(X,Y)); \
    type = eFruit::CONC2(X,Y); \
  } \
}

MAKE_FRUIT(a,pple);
MAKE_FRUIT(b,anana);
MAKE_FRUIT(w,atermelon);
MAKE_FRUIT(p,ear);
</code></pre>
<p>expandiert (cl /P) sieht es dann so aus:</p>
<pre><code>template &lt;typename T&gt; struct apple : public FruitBase { apple() { name = &quot;apple&quot;; type = eFruit::Apple; } };
template &lt;typename T&gt; struct banana : public FruitBase { banana() { name = &quot;banana&quot;; type = eFruit::Banana; } };
template &lt;typename T&gt; struct watermelon : public FruitBase { watermelon() { name = &quot;watermelon&quot;; type = eFruit::Watermelon; } };
template &lt;typename T&gt; struct pear : public FruitBase { pear() { name = &quot;pear&quot;; type = eFruit::Pear; } };
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2288059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288059</guid><dc:creator><![CDATA[dd++ 0]]></dc:creator><pubDate>Wed, 09 Jan 2013 19:05:05 GMT</pubDate></item><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Thu, 12 Jun 2014 12:13:28 GMT]]></title><description><![CDATA[<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288070</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Thu, 12 Jun 2014 12:13:28 GMT</pubDate></item><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Wed, 09 Jan 2013 20:07:30 GMT]]></title><description><![CDATA[<p>Wieso einfach wenns kompliziert auch geht, nen?</p>
<p>Einfach:</p>
<pre><code class="language-cpp">MAKE_FRUIT(apple, eFruit::Apple)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2288092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288092</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 09 Jan 2013 20:07:30 GMT</pubDate></item><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Wed, 09 Jan 2013 22:54:32 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Wieso einfach wenns kompliziert auch geht, nen?</p>
<p>Einfach:</p>
<pre><code class="language-cpp">MAKE_FRUIT(apple, eFruit::Apple)
</code></pre>
</blockquote>
<p>ich denke, dass es auch irgendwie mit</p>
<pre><code>MAKE_FRUIT(apple);
</code></pre>
<p>geht - boost hat ja eine sehr schöne preprocessor library (<a href="http://www.boostpro.com/mplbook/preprocessor.html" rel="nofollow">http://www.boostpro.com/mplbook/preprocessor.html</a>) und dd++ hat glaube ich dazu schon die richtige Richtung eingeschlagen - aber</p>
<pre><code>MAKE_FRUIT(apple, eFruit::Apple)
</code></pre>
<p>scheint tatsächlich am sinnvollsten zu sein - stifte am wenigsten Verwirrung - es wäre schön wenn man auch noch verhindern könnte das jemand</p>
<pre><code>MAKE_FRUIT(apple, eFruit::Banana)
</code></pre>
<p>macht - ob man das irgendwie mit einem static_assert hinbekommt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288125</guid><dc:creator><![CDATA[Agin34]]></dc:creator><pubDate>Wed, 09 Jan 2013 22:54:32 GMT</pubDate></item><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Thu, 10 Jan 2013 00:05:21 GMT]]></title><description><![CDATA[<p>Agin34 schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Wieso einfach wenns kompliziert auch geht, nen?</p>
<p>Einfach:</p>
<pre><code class="language-cpp">MAKE_FRUIT(apple, eFruit::Apple)
</code></pre>
</blockquote>
<p>ich denke, dass es auch irgendwie mit</p>
<pre><code>MAKE_FRUIT(apple);
</code></pre>
<p>geht - boost hat ja eine sehr schöne preprocessor library (<a href="http://www.boostpro.com/mplbook/preprocessor.html" rel="nofollow">http://www.boostpro.com/mplbook/preprocessor.html</a>) und dd++ hat glaube ich dazu schon die richtige Richtung eingeschlagen</p>
</blockquote>
<p>Ich bin mir ziemlich sicher dass es nicht geht.<br />
Der C++ PP bietet zwar Operatoren mit dem man zwei Tokens zusammenpappen kann, aber soweit ich weiss keine Möglichkeit ein Token in mehrere Teile zu zerlegen.</p>
<blockquote>
<p>- aber</p>
<pre><code>MAKE_FRUIT(apple, eFruit::Apple)
</code></pre>
<p>scheint tatsächlich am sinnvollsten zu sein - stifte am wenigsten Verwirrung</p>
</blockquote>
<p>Ja.<br />
Mit &quot;einfach&quot; meine ich ja nicht (nur) einfach anzuwenden, sondern auch einfach zu schreiben, zu warten und vor allem zu verstehen wenn man den Code liest.<br />
Selbst wenn es eine Boost.PP Lösung geben sollte (was ich wie gesagt bezweifle) ist davon auszugehen dass diese nicht gerade einfach zu schreiben und/oder verstehen wäre.</p>
<blockquote>
<p>- es wäre schön wenn man auch noch verhindern könnte das jemand</p>
<pre><code>MAKE_FRUIT(apple, eFruit::Banana)
</code></pre>
<p>macht - ob man das irgendwie mit einem static_assert hinbekommt...</p>
</blockquote>
<p>Also mir fallen da nur extrem hässliche Lösungen ein, und ganz spontan auch nichts was ohne <code>constexpr</code> auskommen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288132</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 10 Jan 2013 00:05:21 GMT</pubDate></item><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Thu, 10 Jan 2013 10:01:42 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Der C++ PP bietet zwar Operatoren mit dem man zwei Tokens zusammenpappen kann, aber soweit ich weiss keine Möglichkeit ein Token in mehrere Teile zu zerlegen.</p>
</blockquote>
<p>Natürlich ist das möglich bis zu einer festen Länge. <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>
<pre><code class="language-cpp">#define HEAD_aaa a
#define HEAD_aaA a
#define HEAD_aAa a
#define HEAD_aAA a
#define HEAD_Aaa A
#define HEAD_AaA A
#define HEAD_AAa A
#define HEAD_AAA A
//...

#define TAIL_aaa aa
#define TAIL_aaA aA
#define TAIL_aAa Aa
#define TAIL_aAA AA
#define TAIL_Aaa aa
#define TAIL_AaA aA
#define TAIL_AAa Aa
#define TAIL_AAA AA
//...

#define TO_UPPER_a A
#define TO_UPPER_A A
//...

#define CAPITALIZE5(head, tail) head ## tail
#define CAPITALIZE4(head, tail) CAPITALIZE5(head, tail)
#define CAPITALIZE3(head, tail) CAPITALIZE4(TO_UPPER_ ## head, tail)
#define CAPITALIZE2(head, tail) CAPITALIZE3(head, tail)
#define CAPITALIZE(x) CAPITALIZE2(HEAD_ ## x, TAIL_ ## x)

#define AAA 3
#define Aaa 4

static_assert(CAPITALIZE(aAA) == AAA, &quot;&quot;);
static_assert(CAPITALIZE(AAA) == AAA, &quot;&quot;);

static_assert(CAPITALIZE(aaa) == Aaa, &quot;&quot;);
static_assert(CAPITALIZE(Aaa) == Aaa, &quot;&quot;);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2288199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288199</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Thu, 10 Jan 2013 10:01:42 GMT</pubDate></item><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Thu, 10 Jan 2013 11:01:51 GMT]]></title><description><![CDATA[<p>ich mache es jetzt so:</p>
<pre><code>MAKE_FRUIT(apple, eFruit::Apple);
</code></pre>
<p>in meinen &quot;echten&quot; Code gibt es genau drei verschiedenen Schreibweisen - das Makro sieht dort etwa so aus:</p>
<pre><code>MAKE_FRUIT(Apple, apple, eFruit::Apple);
</code></pre>
<p>wie gesagt ist dies am einfachsten zu verstehen, warten, etc.</p>
<p>Allerdings könnte man jetzt noch auf Basis des Obigen Makros noch ein Helpermakro zur verfügung stehen, das das obige makro einfach aufruft - in Pseudocode etwa so:</p>
<pre><code>MAKE_FRUIT_LAZY_TYPER(X) \
MAKE_FRUIT( Uppercase(X), Lowercase(X), eFruit::X);

// Verwendung:
MAKE_FRUIT_LAZY_TYPER(Apple);
</code></pre>
<p>Den Code von TyRoXx kann man z. B. für alle Buchstaben und einer festen länge von 15 Zeichen mit z. B. python Skript generieren... muss mal sehen ob ich diesen Aufwand betreibe - auf jeden fall wäre es eine Nette C++ Übung um den Präprozessor kennenzulernen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288218</guid><dc:creator><![CDATA[Agin34]]></dc:creator><pubDate>Thu, 10 Jan 2013 11:01:51 GMT</pubDate></item><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Thu, 10 Jan 2013 14:13:42 GMT]]></title><description><![CDATA[<p>Agin34 schrieb:</p>
<blockquote>
<p>z. B. python Skript generieren...</p>
</blockquote>
<p>dann generierse doch gleich alles komplett .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288327</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 10 Jan 2013 14:13:42 GMT</pubDate></item><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Thu, 10 Jan 2013 16:51:41 GMT]]></title><description><![CDATA[<p>Agin34 schrieb:</p>
<blockquote>
<p>Den Code von TyRoXx kann man z. B. für alle Buchstaben und einer festen länge von 15 Zeichen mit z. B. python Skript generieren... muss mal sehen ob ich diesen Aufwand betreibe - auf jeden fall wäre es eine Nette C++ Übung um den Präprozessor kennenzulernen</p>
</blockquote>
<p>Dir ist schon klar dass das resultierende File vermutlich grösser wäre als der gesamte auf der Erde verfügbare Speicherplatz...?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288413</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 10 Jan 2013 16:51:41 GMT</pubDate></item><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Thu, 10 Jan 2013 17:52:48 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>dann generierse doch gleich alles komplett .</p>
</blockquote>
<p>das ist die andere Möglichkeit. mit C++ oder Python oder ... einen kleinen Codegenerator schreiben und als Custombuildstep (wie Qt/moc) in das Buildsystem einbauen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288457</guid><dc:creator><![CDATA[dd++ 0]]></dc:creator><pubDate>Thu, 10 Jan 2013 17:52:48 GMT</pubDate></item><item><title><![CDATA[Reply to Variable mit selben Groß und Kleingeschreiben in Macro on Mon, 14 Jan 2013 08:37:39 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Dir ist schon klar dass das resultierende File vermutlich grösser wäre als der gesamte auf der Erde verfügbare Speicherplatz...?</p>
</blockquote>
<p>ja ist mir direkt nach dem Posting eingefallen <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="😉"
    /> - bin mir relativ sicher, dass es schon irgendwie schöner gehen muss...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289452</guid><dc:creator><![CDATA[Agin34]]></dc:creator><pubDate>Mon, 14 Jan 2013 08:37:39 GMT</pubDate></item></channel></rss>