<?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[enum verunden]]></title><description><![CDATA[<p>Hallo</p>
<p>Also ich fang am besten gleich mal mit Code an:</p>
<pre><code class="language-cpp">enum MyEnum
{
  val0 = 0,  // 000
  val1 = 1,  // 001
  val2 = 2,  // 010
  val3 = 3,  // 011
  val4 = 4,  // 100
  val5 = 5,  // 101
  val6 = 6,  // 110
  val6 = 7,  // 111
}
</code></pre>
<p>so nun erstelle ich 2 Objekte</p>
<pre><code class="language-cpp">MyEnum first  = val1;
MyEnum second = val2;
</code></pre>
<p>wenn ich diese nun verunde:</p>
<pre><code class="language-cpp">MyEnum third = first &amp; second;
</code></pre>
<p>erhalte ich nen Compilerfehler: '=': 'int' kann nicht in 'MyEnum' konvertiert werden.</p>
<p>Wieso dass denn? Sind doch alle vom typ MyEnum.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270928/enum-verunden</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 18:02:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270928.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Jul 2010 13:53:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to enum verunden on Tue, 20 Jul 2010 13:53:32 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Also ich fang am besten gleich mal mit Code an:</p>
<pre><code class="language-cpp">enum MyEnum
{
  val0 = 0,  // 000
  val1 = 1,  // 001
  val2 = 2,  // 010
  val3 = 3,  // 011
  val4 = 4,  // 100
  val5 = 5,  // 101
  val6 = 6,  // 110
  val6 = 7,  // 111
}
</code></pre>
<p>so nun erstelle ich 2 Objekte</p>
<pre><code class="language-cpp">MyEnum first  = val1;
MyEnum second = val2;
</code></pre>
<p>wenn ich diese nun verunde:</p>
<pre><code class="language-cpp">MyEnum third = first &amp; second;
</code></pre>
<p>erhalte ich nen Compilerfehler: '=': 'int' kann nicht in 'MyEnum' konvertiert werden.</p>
<p>Wieso dass denn? Sind doch alle vom typ MyEnum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929174</guid><dc:creator><![CDATA[y-vonne]]></dc:creator><pubDate>Tue, 20 Jul 2010 13:53:32 GMT</pubDate></item><item><title><![CDATA[Reply to enum verunden on Tue, 20 Jul 2010 13:56:57 GMT]]></title><description><![CDATA[<p>Zur Auswertung des Ausdrucks wird zuerst ein Konvertierung zu int durchgeführt. Das muss du explizit wieder zu deinem enum casten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929177</guid><dc:creator><![CDATA[-----]]></dc:creator><pubDate>Tue, 20 Jul 2010 13:56:57 GMT</pubDate></item><item><title><![CDATA[Reply to enum verunden on Tue, 20 Jul 2010 13:59:52 GMT]]></title><description><![CDATA[<p>und eine andere Möglichkeits gibts nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929179</guid><dc:creator><![CDATA[y-vonne]]></dc:creator><pubDate>Tue, 20 Jul 2010 13:59:52 GMT</pubDate></item><item><title><![CDATA[Reply to enum verunden on Tue, 20 Jul 2010 14:10:55 GMT]]></title><description><![CDATA[<p>y-vonne schrieb:</p>
<blockquote>
<p>und eine andere Möglichkeits gibts nicht?</p>
</blockquote>
<p>doch, so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct MyEnum
{
    explicit MyEnum( int val ) : m_val( val ) {}
    MyEnum&amp; operator&amp;=( MyEnum b )
    {
        m_val &amp;= b.m_val;
        return *this;
    }
    friend std::ostream&amp; operator&lt;&lt;( std::ostream&amp; out, MyEnum e )
    {
        return out &lt;&lt; &quot;val&quot; &lt;&lt; e.m_val;
    }
private:
    int m_val;
};
MyEnum operator&amp;( MyEnum a, MyEnum b )
{
    return a &amp;= b;
}

namespace
{
    const MyEnum val0(0);
    const MyEnum val1(1);
    const MyEnum val2(2);
    const MyEnum val3(3);
    const MyEnum val4(4);
    const MyEnum val5(5);
    const MyEnum val6(6);
    const MyEnum val7(7);
}

int main()
{
    using namespace std;
    MyEnum first  = val1;
    MyEnum second = val2;
    MyEnum third = first &amp; second; // jetzt geht es
    cout &lt;&lt; &quot;third= &quot; &lt;&lt; third &lt;&lt; endl;
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1929183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929183</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Tue, 20 Jul 2010 14:10:55 GMT</pubDate></item><item><title><![CDATA[Reply to enum verunden on Tue, 20 Jul 2010 14:26:31 GMT]]></title><description><![CDATA[<p>Aha. Super danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929197</guid><dc:creator><![CDATA[y-vonne]]></dc:creator><pubDate>Tue, 20 Jul 2010 14:26:31 GMT</pubDate></item><item><title><![CDATA[Reply to enum verunden on Tue, 20 Jul 2010 15:02:30 GMT]]></title><description><![CDATA[<p>Hier hat c++ zum glück eine Hintertür gelassen.</p>
<p>Man kann INT auch nach einen ENUM casten.<br />
(Ist glaube ich auch so vorgesehen)</p>
<pre><code class="language-cpp">MyEnum third = MyEnum(first &amp; second);
</code></pre>
<p>Lichlein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929218</guid><dc:creator><![CDATA[Lichtlein]]></dc:creator><pubDate>Tue, 20 Jul 2010 15:02:30 GMT</pubDate></item><item><title><![CDATA[Reply to enum verunden on Tue, 20 Jul 2010 15:19:20 GMT]]></title><description><![CDATA[<p>Werner_logoff schrieb:</p>
<blockquote>
<p>doch, so:</p>
</blockquote>
<p>Lichtlein schrieb:</p>
<blockquote>
<p>Man kann INT auch nach einen ENUM casten.</p>
</blockquote>
<p>int und enum. INT und ENUM gibt es nicht.</p>
<p>Die böse Falle an beiden Lösungen ist, dass man Werte basteln kann, die in der Enumeration überhaupt nicht vorkommen. Werners Code gibt auch dann &quot;val0&quot; aus, wenn es überhaupt kein val0 gibt.</p>
<p>Man kann ein int als enum verkleiden, wie von Lichtlein vorgeschlagen. Aber wenn der Wert nicht in der Enumeration vorkommt, ist das Ergebnis undefiniert. Auch hier einfach mal val0 aus der Enumeration löschen, und schon ist das Ergebnis von val1 &amp; val2 nur noch Schrott.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929224</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Tue, 20 Jul 2010 15:19:20 GMT</pubDate></item><item><title><![CDATA[Reply to enum verunden on Tue, 20 Jul 2010 15:26:09 GMT]]></title><description><![CDATA[<p>Nukularfüsiker schrieb:</p>
<blockquote>
<p>Die böse Falle an beiden Lösungen ist, dass man Werte basteln kann, die in der Enumeration überhaupt nicht vorkommen. Werners Code gibt auch dann &quot;val0&quot; aus, wenn es überhaupt kein val0 gibt.</p>
</blockquote>
<p>Ja sicher, deshalb ist der implizite cast auch verboten.</p>
<p>Man kann aber als Programmierer von struct MyEnum dafür sorgen, dass die UND-Operation nur gültige Werte liefert, bzw. bei ungültigen Werten in ein wie immer geartetes Fehlerhandling übergeht.<br />
Spätestens der Konstruktor muss prüfen, ob das 'val', welches da daher kommt, ok ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929229</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 20 Jul 2010 15:26:09 GMT</pubDate></item><item><title><![CDATA[Reply to enum verunden on Tue, 20 Jul 2010 16:19:07 GMT]]></title><description><![CDATA[<p>Warum legst Du die Werte der Konstanten denn explizit fest, wenn sie sowieso bei 0 beginnen und dann um 1 inkrementiert werden?</p>
<p>lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929264</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Tue, 20 Jul 2010 16:19:07 GMT</pubDate></item><item><title><![CDATA[Reply to enum verunden on Tue, 20 Jul 2010 17:29:47 GMT]]></title><description><![CDATA[<p>Warum nimmst du nicht gleich <code>int</code> , wenn du rechnen willst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929283</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 20 Jul 2010 17:29:47 GMT</pubDate></item><item><title><![CDATA[Reply to enum verunden on Wed, 21 Jul 2010 11:54:33 GMT]]></title><description><![CDATA[<p>Die Motivation für Enumaration ist doch meiner Meinung nach dem Compiler Feste Werte mitzuteilen. Dazu hat man drei Möglichkeiten:<br />
#define, enum und const int (int als beispiel)</p>
<p>Besonders in Hardware nahen Bereich gibt es auch BitFelder die man zum besseren Verständnis mit Namen Declariert.</p>
<p>Hat bestimmt schon jeder gesehen:</p>
<pre><code class="language-cpp">#define   UART_SEND  0x01
#define   UART_ERROR 0x02
#define   UART_REQ   0x03
usw.
</code></pre>
<p>Von defines soll man halten was man will. <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>Nehmen wir also const int (oder sonstwas)</p>
<pre><code class="language-cpp">const int UART_SEND  0x01;
const int UART_ERROR 0x02;
const int UART_REQ   0x03;
</code></pre>
<p>Ist möglich aber man kann dann in C++ nicht mehr mit dem Type Arbeiten.</p>
<p>Jetzt noch die Möglichkeit 3 enum:</p>
<pre><code class="language-cpp">enum eUart
{
UART_SEND  = 0x1,
UART_ERROR = 0x2,
UART_REQ   = 0x3
};
</code></pre>
<p>So jetzt habe ich einen Type und passende werte für jedes Bit.</p>
<p>Das Problem ist es wenn ein UART Register auslesen wird. Da hat man mit Sicherheit einen Wert der nicht in einen define, const oder enum vorkommt.</p>
<p>Genau so Problem fälle hat man bei C++ bedacht und deshalb lässt der Compiler auch den &quot;enum::constructor&quot; zu bz. eUart(int RegisterInhalt) ohne eine Warnung zu geben das hier zwei unpassende Werte zusammen gesetzt werden.</p>
<p>Klar ist das man damit immer vorsichtig umgehen sollte und in einem switch/case Konstrukt für enum's immer ein assert im default Zweig haben sollte.</p>
<p>Lichtlein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929551</guid><dc:creator><![CDATA[Lichtlein]]></dc:creator><pubDate>Wed, 21 Jul 2010 11:54:33 GMT</pubDate></item><item><title><![CDATA[Reply to enum verunden on Wed, 21 Jul 2010 15:39:54 GMT]]></title><description><![CDATA[<p>Lichtlein schrieb:</p>
<blockquote>
<p>Genau so Problem fälle hat man bei C++ bedacht und deshalb lässt der Compiler auch den &quot;enum::constructor&quot; zu bz. eUart(int RegisterInhalt) ohne eine Warnung zu geben das hier zwei unpassende Werte zusammen gesetzt werden.</p>
</blockquote>
<p>Das ist kein Konstruktor oder was Ähnliches, sondern ein Cast. Man könnte statt <code>eUart(myInt)</code> ebenso gut <code>(eUart)myInt</code> schreiben.</p>
<p>Und natürlich kann man mit Casts Typsicherheit aushebeln. Ich kann ja auch <code>int(myPointer)</code> schreiben, und es kompiliert ohne Warnung. Nur geht das am Konzept von <code>enum</code> vorbei, welche eine Anzahl festgelegter Zustände (Enumeratoren) zulassen und beim Rest explizite Konvertierungen erforderlich machen. Wenn du nämlich dauernd rechnest und castest, bist du nicht mehr weit von <code>int</code> entfernt.</p>
<p>Mich wundert es, dass der folgende Vorschlag noch nicht gebracht wurde. Ich würde allerdings auch eher zur Klasse tendieren, weil dann die potentiell fehleranfällige implizite Konvertierung zu integralen Typen nicht mehr vorhanden ist.</p>
<pre><code class="language-cpp">MyEnum operator&amp; (MyEnum lhs, MyEnum rhs);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1929674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929674</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 21 Jul 2010 15:39:54 GMT</pubDate></item></channel></rss>