<?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&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante?]]></title><description><![CDATA[<p>Hi,</p>
<p>hab ein Problem mit folgendem Kode:</p>
<pre><code class="language-cpp">// test.h
namespace myNS {
	typedef unsigned int	myEnum;

	extern const myEnum ME_TIME;
	extern const myEnum ME_ALPHA;
	// ..
}

// anwendung.cpp
namespace andererNS {

	// ..
	using namespace myNS;
	switch (/*... */)
	{
	case ME_TIME:
		// ..
	case ME_ALPHA:
		// ..
	}
	// ..
}
</code></pre>
<p>und dazu folgenden Kompilerfehler:</p>
<blockquote>
<p>f:\Quellkode\CPP\Tritratrallala\BlendingDemo\PatternDialog.cpp(42): error C2051: case-Ausdruck ist keine Konstante<br />
f:\Quellkode\CPP\Tritratrallala\BlendingDemo\PatternDialog.cpp(43): error C2051: case-Ausdruck ist keine Konstante<br />
f:\Quellkode\CPP\Tritratrallala\BlendingDemo\PatternDialog.cpp(44): error C2051: case-Ausdruck ist keine Konstante<br />
usw ...</p>
</blockquote>
<p>Der Fehler ist mir unerklärlich, da die case-Variable eine Konstante ist.</p>
<p>Was habe ich übersehen?</p>
<p>Danke,<br />
don_basto.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/134731/switch-case-case-ausdruck-keine-konstante-obwohl-typedef-einer-konstante</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 21:27:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/134731.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 28 Jan 2006 09:40:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [switch&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante? on Sat, 28 Jan 2006 09:40:28 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>hab ein Problem mit folgendem Kode:</p>
<pre><code class="language-cpp">// test.h
namespace myNS {
	typedef unsigned int	myEnum;

	extern const myEnum ME_TIME;
	extern const myEnum ME_ALPHA;
	// ..
}

// anwendung.cpp
namespace andererNS {

	// ..
	using namespace myNS;
	switch (/*... */)
	{
	case ME_TIME:
		// ..
	case ME_ALPHA:
		// ..
	}
	// ..
}
</code></pre>
<p>und dazu folgenden Kompilerfehler:</p>
<blockquote>
<p>f:\Quellkode\CPP\Tritratrallala\BlendingDemo\PatternDialog.cpp(42): error C2051: case-Ausdruck ist keine Konstante<br />
f:\Quellkode\CPP\Tritratrallala\BlendingDemo\PatternDialog.cpp(43): error C2051: case-Ausdruck ist keine Konstante<br />
f:\Quellkode\CPP\Tritratrallala\BlendingDemo\PatternDialog.cpp(44): error C2051: case-Ausdruck ist keine Konstante<br />
usw ...</p>
</blockquote>
<p>Der Fehler ist mir unerklärlich, da die case-Variable eine Konstante ist.</p>
<p>Was habe ich übersehen?</p>
<p>Danke,<br />
don_basto.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/978688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/978688</guid><dc:creator><![CDATA[don_basto]]></dc:creator><pubDate>Sat, 28 Jan 2006 09:40:28 GMT</pubDate></item><item><title><![CDATA[Reply to [switch&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante? on Sat, 28 Jan 2006 10:36:05 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Kannst du den Fehler in einem vollständigen minimal-Beispiel reproduzieren? Der Code sieht so nämlich korrekt aus. (Wenn man sich den richtigen Code an den &quot;/ /...&quot;-Stellen denkt).</p>
<p>Gruß Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/978699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/978699</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Sat, 28 Jan 2006 10:36:05 GMT</pubDate></item><item><title><![CDATA[Reply to [switch&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante? on Sat, 28 Jan 2006 10:15:48 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6091">@Caipi</a>: Hier mal mehr Kode <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="😃"
    /></p>
<p>test.h:</p>
<pre><code class="language-cpp">namespace myNS
{
	typedef unsigned int myEnum;

	extern const myEnum ME_TIME;
    extern const myEnum ME_ALPHA;

	unsigned int getType(int type);
}
</code></pre>
<p>test.cpp:</p>
<pre><code class="language-cpp">#include &quot;test.h&quot;

namespace myNS
{
	const myEnum ME_TIME	= 0x0001;
    const myEnum ME_ALPHA	= 0X0002;

	unsigned int getType(int type)
	{
		if (type == 1)	return ME_TIME;
		else			return ME_ALPHA;
	}
}
</code></pre>
<p>anwendung.h:</p>
<pre><code class="language-cpp">namespace andererNS
{
	class myApp
	{
	public:
		void doSomething();
	};
}
</code></pre>
<p>anwendung.cpp:</p>
<pre><code class="language-cpp">#include &quot;test.h&quot;
#include &quot;anwendung.h&quot;

namespace andererNS
{
	void myApp::doSomething()
	{
		using namespace myNS;
		switch (getType(1))
		{
		case ME_TIME:
			break;
		case ME_ALPHA:
			break;
		}
	}
}
</code></pre>
<p>Und die passenden Fehler:</p>
<blockquote>
<p>f:\Quellkode\CPP\Tritratrallala\SwitchTest\anwendung.cpp(15): warning C4060: switch-Anweisung enthält weder 'case'- noch 'default'-Marken<br />
f:\Quellkode\CPP\Tritratrallala\SwitchTest\anwendung.cpp(13): error C2051: case-Ausdruck ist keine Konstante<br />
f:\Quellkode\CPP\Tritratrallala\SwitchTest\anwendung.cpp(11): error C2051: case-Ausdruck ist keine Konstante</p>
</blockquote>
<p>Vllt. hilft's ja weiter .. <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/978708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/978708</guid><dc:creator><![CDATA[don_basto]]></dc:creator><pubDate>Sat, 28 Jan 2006 10:15:48 GMT</pubDate></item><item><title><![CDATA[Reply to [switch&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante? on Sat, 28 Jan 2006 14:25:32 GMT]]></title><description><![CDATA[<p>Um den Fehler zu verstehen, bedenke, dass <em>zuerst</em> die Module compiliert und <em>danach</em> zu einem Programm gelinkt werden.</p>
<p>In anwendung.cpp müssen die Variablen ME_TIME und ME_ALPHA zur compile-Zeit konstant sein, was aber nicht möglich ist, da sie als extern const deklariert sind und somit erst durch den Linker, der nach dem Compiler kommt, den Speicherbereich zugewiesen bekommen.</p>
<p>Vergl. z.B. auch den folgenden Code:</p>
<pre><code class="language-cpp">// main.cpp

// Externes Linkage (extern ist hier Pflicht!). Siehe dazu auch weiter unten.
extern const unsigned int global_var1 = 1;
extern const unsigned int global_var2 = 2;

void foo(unsigned int);

int main()
{
    cout &lt;&lt; global_var1 &lt;&lt; endl;
    foo(1);
    cout &lt;&lt; endl;
}

// test.cpp

// extern-Deklaration. (Siehe dazu ebenfalls weiter unten).
extern const unsigned int global_var1;
extern const unsigned int global_var2;

void foo(unsigned int value)
{
    switch(value)
    {
        case global_var1: // ist zur compile-Zeit nicht konstant, da externes Linkage.
            cout &lt;&lt; &quot;global_var1&quot;; 
            break;
        case global_var2: // dito.
            cout &lt;&lt; &quot;global_var2&quot;;
            break;
    }
}
</code></pre>
<p>Desweiteren enthält dein geposteter Code-Snippet einen weiteren Fehler: Globale (bzw. im namespace) definierte und mit dem Zugriffspezifizierer const versehene Variablen haben in C++ internes (und nicht externes) Linkage. Willst du Globale, konstante Variablen mit externem Linkage definieren, schreibst du:</p>
<pre><code class="language-cpp">extern const T var = ...;
</code></pre>
<p>(Wobei T der Typ und var der Bezeichner).</p>
<p>Gruß Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/978888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/978888</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Sat, 28 Jan 2006 14:25:32 GMT</pubDate></item><item><title><![CDATA[Reply to [switch&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante? on Sat, 28 Jan 2006 14:55:30 GMT]]></title><description><![CDATA[<p>Danke für die Antwort. <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>Also dann werden die Konstanten nicht wahrgenommen, weil sie in einer anderen Übersetzungseinheit (test.cpp) definiert werden und somit beim Übersetzen von anwendung.cpp nicht bekannt sind, _obwohl_ über die Variablen bekannt ist, dass sie konstant sind (Deklaration in test.h). Das Verhalten ist nicht ganz intuitiv.<br />
Die Lösung ist jetzt, die Definitionen von test.cpp in test.h zu verschieben, wenn 's auch nicht sehr schön ist.</p>
<p>Caipi schrieb:</p>
<blockquote>
<p>Desweiteren enthält dein geposteter Code-Snippet einen weiteren Fehler: Globale (bzw. im namespace) definierte und mit dem Zugriffspezifizierer const versehene Variablen haben in C++ internes (und nicht externes) Linkage. Willst du Globale, konstante Variablen mit externem Linkage definieren, schreibst du:</p>
<pre><code class="language-cpp">extern const T var = ...;
</code></pre>
<p>(Wobei T der Typ und var der Bezeichner).</p>
</blockquote>
<p>Was meinst du damit?<br />
Wenn ich extern verwende, werde ich es ja garantiert woanders definieren und wenn ich's gleich definieren kann/will, brauch ich das Schlüsselwort extern nicht. Die Begriffe externes/internes Linkage muss ich erstmal nachschlagen :).</p>
<p>Grüsse,<br />
don_basto.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/978911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/978911</guid><dc:creator><![CDATA[don_basto]]></dc:creator><pubDate>Sat, 28 Jan 2006 14:55:30 GMT</pubDate></item><item><title><![CDATA[Reply to [switch&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante? on Sun, 29 Jan 2006 08:47:23 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">extern const myEnum ME_TIME; 
extern const myEnum ME_ALPHA;
</code></pre>
<p>so wie du es deklariert hast sind ME_TIME und ME_ALPHA variablen vom typ myEnum. und variablen sind natürlich nicht konstant. int-konstanten deklariert man in c++ am besten mit enum {}:</p>
<pre><code class="language-cpp">namespace myNS {
    enum myEnum
    {
      ME_TIME  = 1,
      ME_ALPHA = 2
    };
    // ..
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/979555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979555</guid><dc:creator><![CDATA[Konfusius]]></dc:creator><pubDate>Sun, 29 Jan 2006 08:47:23 GMT</pubDate></item><item><title><![CDATA[Reply to [switch&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante? on Mon, 30 Jan 2006 10:22:37 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9573">@Konfusius</a>:<br />
Eine Variable ist variabel, klar. Aber sobald man ein const davorsetzt, ist sie es nach der Initaliserung nicht mehr. <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="😉"
    /><br />
enum hab ich nicht verwendet, weil ich dann bei der Verwendung casten müsste. Da ist mir typedef lieber.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980802</guid><dc:creator><![CDATA[don_basto]]></dc:creator><pubDate>Mon, 30 Jan 2006 10:22:37 GMT</pubDate></item><item><title><![CDATA[Reply to [switch&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante? on Mon, 30 Jan 2006 10:28:03 GMT]]></title><description><![CDATA[<p>Das Problem dabei ist, daß switch/case eine <strong>Compilezeit</strong>-Konstante benötigt - externe Konstanten stehen allerdings zur Compilezeit noch nicht fest (weil sie davon abhängen, welche anderen Module mit eingelinkt werden) und funktionieren deshalb an der Stelle nicht.</p>
<p>(PS: Wieso ist es dir so wichtig, daß deine Konstanten EXTERNE Bindung bekommen?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980810</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 30 Jan 2006 10:28:03 GMT</pubDate></item><item><title><![CDATA[Reply to [switch&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante? on Mon, 30 Jan 2006 10:49:54 GMT]]></title><description><![CDATA[<p>Hab gelesen, dass man grudnsätzlich keine Variablen in den Headern definieren sollte, wegen Mehrdeutigkeiten beim Linken. Bei konstanten Variablen einfachen Typs (wie mein unsigned int) gibt's wohl trotzden keine Probleme. Deswegen habe ich jetzt die Definitionen in den Header übernommen, was funktioniert.<br />
Im Header steht jetzt:</p>
<pre><code class="language-cpp">const myEnum ME_TIME = 1;
const myEnum ME_ALPHA = 2;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/980830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980830</guid><dc:creator><![CDATA[don_basto]]></dc:creator><pubDate>Mon, 30 Jan 2006 10:49:54 GMT</pubDate></item><item><title><![CDATA[Reply to [switch&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante? on Mon, 30 Jan 2006 10:53:56 GMT]]></title><description><![CDATA[<p>don_basto schrieb:</p>
<blockquote>
<p>Hab gelesen, dass man grudnsätzlich keine Variablen in den Headern definieren sollte, wegen Mehrdeutigkeiten beim Linken.</p>
</blockquote>
<p>Konstanten ohne explizite extern-Angabe bekommen automatisch interne Linkage, also bekommt der Linker sie überhaupt nicht zu sehen. Problematisch wird es nur mit &quot;echten&quot; Variablen, die doppelt dekalriert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980836</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 30 Jan 2006 10:53:56 GMT</pubDate></item><item><title><![CDATA[Reply to [switch&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante? on Mon, 30 Jan 2006 19:22:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6774">@don_basto</a><br />
Darf ich mal fragen, was du für einen Compiler verwendest? Die Fehlermeldung ist nämlich total irreführend, denn nach case steht definitiv eine Konstante. Das Problem ist nur, case erwartet keine Konstante, sondern einen konstanten Ausdruck. Das ist ein kleiner, aber feiner Unterschied.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981470</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 30 Jan 2006 19:22:26 GMT</pubDate></item><item><title><![CDATA[Reply to [switch&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante? on Mon, 30 Jan 2006 19:44:28 GMT]]></title><description><![CDATA[<p>Ich verwende VC7.1 von MS.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981489</guid><dc:creator><![CDATA[don_basto]]></dc:creator><pubDate>Mon, 30 Jan 2006 19:44:28 GMT</pubDate></item><item><title><![CDATA[Reply to [switch&#x2F;case] case-Ausdruck keine Konstante, obwohl typedef einer Konstante? on Mon, 30 Jan 2006 20:39:12 GMT]]></title><description><![CDATA[<p>Ah ok, kenne nur englische Versionen des Compilers. Und da heisst es</p>
<blockquote>
<p>case expression not constant</p>
</blockquote>
<p>was wiederum ok ist. Da hat wohl jemand bei der Übersetzung nicht aufgepasst und</p>
<blockquote>
<p>case expression not a constant</p>
</blockquote>
<p>gelesen. <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/981531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981531</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 30 Jan 2006 20:39:12 GMT</pubDate></item></channel></rss>