<?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[Switch und #defines]]></title><description><![CDATA[<p>Abend!</p>
<p>Ich habe zum einen Mal ein par #define:</p>
<pre><code class="language-cpp">#define QUEUE       10
#define QUEUE_5     20
#define QUEUE_SKY   30
...
</code></pre>
<p>und dann habe ich noch eine Klasse, die unter anderem eine ID und einen Namen hat. Der Ctor sieht so aus:</p>
<pre><code class="language-cpp">Group::Group(uint groupID) : mGroupID(groupID) {
   switch(groupID) {
      case QUEUE_1:
         mName = &quot;QUEUE_1&quot;;
	 break;
      case QUEUE_2:
         mName = &quot;QUEUE_2&quot;;
         break;

      ...
      default:
         std::stringstream ss;
	 ss &lt;&lt; groupID;
	 name = &quot;QUEUE&quot; + ss.str();
         break;
}
</code></pre>
<p>Die Logik dahinter:<br />
Wenn die an den Ctor übergebene ID eine der vordefinierten IDs ist, soll der Name gleich dem #define Namen lauten. Ansonsten soll der Name QUEUE_%id lauten.</p>
<p>Mein Code klappt natürlich, aber das riesige switch ist irgendwie etwas unelegant. Geht das in C++ eleganter/kompakter?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262743/switch-und-defines</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 12:09:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262743.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Mar 2010 17:37:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Switch und #defines on Wed, 10 Mar 2010 17:37:56 GMT]]></title><description><![CDATA[<p>Abend!</p>
<p>Ich habe zum einen Mal ein par #define:</p>
<pre><code class="language-cpp">#define QUEUE       10
#define QUEUE_5     20
#define QUEUE_SKY   30
...
</code></pre>
<p>und dann habe ich noch eine Klasse, die unter anderem eine ID und einen Namen hat. Der Ctor sieht so aus:</p>
<pre><code class="language-cpp">Group::Group(uint groupID) : mGroupID(groupID) {
   switch(groupID) {
      case QUEUE_1:
         mName = &quot;QUEUE_1&quot;;
	 break;
      case QUEUE_2:
         mName = &quot;QUEUE_2&quot;;
         break;

      ...
      default:
         std::stringstream ss;
	 ss &lt;&lt; groupID;
	 name = &quot;QUEUE&quot; + ss.str();
         break;
}
</code></pre>
<p>Die Logik dahinter:<br />
Wenn die an den Ctor übergebene ID eine der vordefinierten IDs ist, soll der Name gleich dem #define Namen lauten. Ansonsten soll der Name QUEUE_%id lauten.</p>
<p>Mein Code klappt natürlich, aber das riesige switch ist irgendwie etwas unelegant. Geht das in C++ eleganter/kompakter?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867119</guid><dc:creator><![CDATA[RealMadridHasser]]></dc:creator><pubDate>Wed, 10 Mar 2010 17:37:56 GMT</pubDate></item><item><title><![CDATA[Reply to Switch und #defines on Wed, 10 Mar 2010 17:44:59 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">const int QUEUE_IDS [] = { QUEUE_1, QUEUE_2, ... };
const char* QUEUE_NAMES [] = { &quot;QUEUE_1&quot;, &quot;QUEUE_2&quot;, ... };

...

for(int i = 0; i &lt; MAX_QUEUE_ID; ++i)
    if( ... ) 
        blubb  = QUEUE_NAMES[i];
</code></pre>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867123</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Wed, 10 Mar 2010 17:44:59 GMT</pubDate></item><item><title><![CDATA[Reply to Switch und #defines on Wed, 10 Mar 2010 17:46:01 GMT]]></title><description><![CDATA[<p>BTW: In C++ definiert man keine Konstanten als Makros, sondern - wer hätte es gedacht - als Konstanten.</p>
<pre><code class="language-cpp">static const int QUEUE = 10;
</code></pre>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867125</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Wed, 10 Mar 2010 17:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to Switch und #defines on Wed, 10 Mar 2010 17:47:55 GMT]]></title><description><![CDATA[<p>Zunächst ein Hinweis: Die Defines sind sehr unschön. Du kannst das auch mit enum lösen.</p>
<p>enum QID<br />
{<br />
QUEUE_1<br />
QUEUE_5,<br />
};</p>
<p>const char * QNAMES[] = { &quot;QUEUE_1&quot;, &quot;QUEUE_5&quot; };</p>
<p>// Verwendung:<br />
QID id;</p>
<p>QNAMES[id];</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867127</guid><dc:creator><![CDATA[trrtz]]></dc:creator><pubDate>Wed, 10 Mar 2010 17:47:55 GMT</pubDate></item><item><title><![CDATA[Reply to Switch und #defines on Wed, 10 Mar 2010 18:05:41 GMT]]></title><description><![CDATA[<p>Danke für die schnellen Antworten! <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>Was ist an den #defines so schlimm? Woher weiß ich jetzt, ob ich jetzt echte konstanten (const) oder enum nehmen soll?<br />
Fakt ist: Ich brauche keinen extra Typ für die Konstanten, sprich es wird niemals sowas geben:</p>
<pre><code class="language-cpp">void methode(QueueID id);
</code></pre>
<p>Wann immer man eine id angeben soll, wird es ein reiner integer sein:</p>
<pre><code class="language-cpp">void methode(int id);
</code></pre>
<p>Nur sollen eben bestimmte ids vordefiniert sein. In meinem Fall wäre ein enum überflüssig, da ich den Typ ja nie brauche. Oder? Ändere ich am besten meine #define in static consts um?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867131</guid><dc:creator><![CDATA[RealMadridHasser]]></dc:creator><pubDate>Wed, 10 Mar 2010 18:05:41 GMT</pubDate></item><item><title><![CDATA[Reply to Switch und #defines on Wed, 10 Mar 2010 18:26:54 GMT]]></title><description><![CDATA[<p>RealMadridHasser schrieb:</p>
<blockquote>
<p>Ändere ich am besten meine #define in static consts um?</p>
</blockquote>
<p>Ob <code>static</code> oder nicht, hängt von der gewünschten Speicherklasse ab, <code>extern</code> wäre eine Alternative. Aber Konstanten sind definitiv angebracht. Makros sind dumme Textersetzungen, die keine Debugsymbole haben und alle Scopes verdrecken. Sie können zwar sehr nützlich sein, aber wenn es Alternativen gibt (typsichere Funktionen und Konstanten), solltest du sie nutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867138</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 10 Mar 2010 18:26:54 GMT</pubDate></item><item><title><![CDATA[Reply to Switch und #defines on Wed, 10 Mar 2010 18:30:53 GMT]]></title><description><![CDATA[<p>RealMadridHasser schrieb:</p>
<blockquote>
<p>Danke für die schnellen Antworten! <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>Was ist an den #defines so schlimm? Woher weiß ich jetzt, ob ich jetzt echte konstanten (const) oder enum nehmen soll?<br />
Fakt ist: Ich brauche keinen extra Typ für die Konstanten, sprich es wird niemals sowas geben:</p>
<pre><code class="language-cpp">void methode(QueueID id);
</code></pre>
<p>Wann immer man eine id angeben soll, wird es ein reiner integer sein:</p>
<pre><code class="language-cpp">void methode(int id);
</code></pre>
<p>Nur sollen eben bestimmte ids vordefiniert sein. In meinem Fall wäre ein enum überflüssig, da ich den Typ ja nie brauche. Oder? Ändere ich am besten meine #define in static consts um?</p>
</blockquote>
<p>Im Prinzip kannst du sowohl const als auch enum verwenden. Allerdings kannst du mit enum einige Fehler ausschließen. Stell dir vor, du hast ganz viele solcher Konstanten für verschiedene Dinge:</p>
<pre><code class="language-cpp">const int STATUS_PROGRAM_OK = 0;
const int STATUS_PROGRAM_ERROR = 1;
const int STATUS_PROGRAM_UNKNOWN = 2;

const int STATUS_SERVER_RUNNING = 0;
const int STATUS_SERVER_ERROR = 1;
const int STATUS_SERVER_UNKNOWN = 2;

// usw..
</code></pre>
<p>Zusätzlich hast du eine Funktione zum Setzen des Status vom Program und vom Server:</p>
<pre><code class="language-cpp">void setProgramStatus(int status);
void setServerStatus(int status);
</code></pre>
<p>Jetzt kannst du diese Funktion ganz normal aufrufen und den Status damit setzen:</p>
<pre><code class="language-cpp">setProgramStatus(STATUS_PROGRAM_OK);
</code></pre>
<p>Nehmen wir an, du hast nun die ganze Zeit mit den Stati von Programm gearbeitet und musst aber nun den Teil für den Serverstatus programmieren. Aus inzwischen gewordener Gewonheit machst du ausversehen:</p>
<pre><code class="language-cpp">setServerStatus(STATUS_PROGRAM_ERROR); // Richtig wäre  STATUS_SERVER_ERROR
</code></pre>
<p>Damit wäre das erste Problem von Konstante klar: Es findet keine Überprüfung statt, ob es für diesen Zweck auch die korrekte ist. Man kann ja alles übergeben. Zweites Problem erkennt man bei der Deklaration der Konstanten. Man muss selber den Zahlenwert vorgeben. Beide Probleme lassen sich mit enum lösen:</p>
<pre><code class="language-cpp">enum ProgramStatus
{
 STATUS_PROGRAM_OK,
 STATUS_PROGRAM_ERROR,
 STATUS_PROGRAM_UNKNOWN
};

enum ServerStatus
{
 STATUS_SERVER_RUNNING,
 STATUS_SERVER_ERROR,
 STATUS_SERVER_UNKNOWN
};

void setProgramStatus(ProgramStatus status);
void setServerStatus(ServerStatus status);
</code></pre>
<p>Man kann nun nicht mehr ausversehen den Status des Servers als STATUS_PROGRAM_OK setzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867140</guid><dc:creator><![CDATA[trrtz]]></dc:creator><pubDate>Wed, 10 Mar 2010 18:30:53 GMT</pubDate></item><item><title><![CDATA[Reply to Switch und #defines on Wed, 10 Mar 2010 18:33:39 GMT]]></title><description><![CDATA[<p>Allerdings hat er das Problem, dass es auch einen ganzen Haufen von Optionen gibt, die er nicht als Konstante aufzählen will bzw. gar nicht kann!</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867143</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Wed, 10 Mar 2010 18:33:39 GMT</pubDate></item><item><title><![CDATA[Reply to Switch und #defines on Wed, 10 Mar 2010 18:33:52 GMT]]></title><description><![CDATA[<p>Was ich nicht gelesen habe ist, dass du nur die von dir beschriebenen Werte vordefinieren willst. In dem Fall musst du zwangsläufig mit Konstanten arbeiten, also.</p>
<p>const int var = wert;</p>
<p>Define ist deshalb nicht schön, da keine Typüberprüfung stattfindet. Das kann zu mysteriösen Fehlermeldungen führen, usw.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867144</guid><dc:creator><![CDATA[trrtz]]></dc:creator><pubDate>Wed, 10 Mar 2010 18:33:52 GMT</pubDate></item><item><title><![CDATA[Reply to Switch und #defines on Wed, 10 Mar 2010 18:36:50 GMT]]></title><description><![CDATA[<blockquote>
<p>Was ich nicht gelesen habe ist, dass du nur die von dir beschriebenen Werte vordefinieren willst. In dem Fall musst du zwangsläufig mit Konstanten arbeiten</p>
</blockquote>
<p>Wieso das?</p>
<pre><code class="language-cpp">enum QID
{
   QUEUE = 10,
   QUEUE_5 = 20,
   QUEUE_SKY = 30
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1867145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867145</guid><dc:creator><![CDATA[wx++]]></dc:creator><pubDate>Wed, 10 Mar 2010 18:36:50 GMT</pubDate></item><item><title><![CDATA[Reply to Switch und #defines on Wed, 10 Mar 2010 18:42:01 GMT]]></title><description><![CDATA[<p>Danke!</p>
<p>Ich denke ich werde normale Konstanten (const) nehmen. Dazu noch ein paar Fragen:</p>
<ol>
<li>
<p>Auf globaler Ebene bedeutet static, dass die Variable nur in dieser UE zugreifbar ist, oder? Definiere ich dann die static variable im header oder in der .cpp datei?</p>
</li>
<li>
<p>Das static ist ja nicht wirklich erforderlich, oder? Sagen wir ich will eine normale non-static konstante. Dann schreibe ich in den Header das:<br />
extern const int foo;<br />
und in die cpp datei das:<br />
const int foo = 2;<br />
Stimmt das?</p>
</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1867151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867151</guid><dc:creator><![CDATA[RealMadridHasser]]></dc:creator><pubDate>Wed, 10 Mar 2010 18:42:01 GMT</pubDate></item><item><title><![CDATA[Reply to Switch und #defines on Wed, 10 Mar 2010 20:53:45 GMT]]></title><description><![CDATA[<p>RealMadridHasser schrieb:</p>
<blockquote>
<ol>
<li>Auf globaler Ebene bedeutet static, dass die Variable nur in dieser UE zugreifbar ist, oder? Definiere ich dann die static variable im header oder in der .cpp datei?</li>
</ol>
</blockquote>
<p>Ja, da static interne Bindung erzeugt. (nur in der aktuellen Übersetzungseinheit sichtbar)<br />
Du <strong>deklarierst</strong> die Variable im Header und <strong>definierst</strong> sie in einer .cpp.<br />
Im Header:</p>
<pre><code class="language-cpp">extern int foo; // Deklaration von foo, da extern gebunden
</code></pre>
<p>.cpp:</p>
<pre><code class="language-cpp">int foo = 2; // Definition, externe Bindung
</code></pre>
<blockquote>
<ol start="2">
<li>Das static ist ja nicht wirklich erforderlich, oder? Sagen wir ich will eine normale non-static konstante. Dann schreibe ich in den Header das:<br />
extern const int foo;<br />
und in die cpp datei das:<br />
const int foo = 2;<br />
Stimmt das?</li>
</ol>
</blockquote>
<p><code>static</code> bewirkt ja genau das Gegenteil von extern. <code>static</code> erzeugt interne Bindung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867212</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 10 Mar 2010 20:53:45 GMT</pubDate></item></channel></rss>