<?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[Human Error oder Compiler Bug?]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mit meinem VS 6 einige Compiler Errors, die mein Grundverständnis einer 'static const' Konstante zutiefst erschüttern.<br />
Hier mal kurz die Voraussetzungen. ich habe 3 separate Files:</p>
<pre><code>// BEGIN File: Constant.h
#ifndef _CONSTANT_INCUDED_
#define _CONSTANT_INCUDED_

class Constant
{
public:
    Constant() {};
    ~Constant() {};

public:
    void foo(void);

public:
    static const int _SIZE;
};

#endif //_CONSTANT_INCUDED_

// END File: Constant.h
</code></pre>
<pre><code>// BEGIN File: Constant.cpp
#include &quot;Constant.h&quot;
#include &lt;stdio.h&gt;

const int Constant::_SIZE = 10;

void Constant::foo(void)
{
    printf(&quot;Size = %i&quot;, Constant::_SIZE);
}

// END File: Constant.cpp
</code></pre>
<p>...und</p>
<pre><code>// BEGIN File main.cpp
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &quot;Constant.h&quot;

void main(void)
{
unsigned char array1[Constant::_SIZE];                      // ERROR: keine Konstante
unsigned char *array2 = new unsigned char[Constant::_SIZE]; // OK

int test = 10;

    switch(test)
    {
        case Constant::_SIZE: // ERROR: keine Konstante
            break;

        case 3:
        default:
            break;
    }

    delete [] array2;
}

// END File: main.cpp
</code></pre>
<p>Habe ich da ein grundliegendes Verständnis problem, oder liegt hier ein Compilerbug vor?</p>
<p>Warum kann ich auf die public static const Konstante in main() nicht als Konstante zugreifen?</p>
<p>Schlimmer wird es, wenn ich Klassen von Constant.cpp ableiten will, die ebenfalls mit der Konstante der Vaterklasse arbeiten müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272409/human-error-oder-compiler-bug</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 20:20:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272409.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Aug 2010 10:36:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Human Error oder Compiler Bug? on Tue, 17 Aug 2010 10:36:29 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mit meinem VS 6 einige Compiler Errors, die mein Grundverständnis einer 'static const' Konstante zutiefst erschüttern.<br />
Hier mal kurz die Voraussetzungen. ich habe 3 separate Files:</p>
<pre><code>// BEGIN File: Constant.h
#ifndef _CONSTANT_INCUDED_
#define _CONSTANT_INCUDED_

class Constant
{
public:
    Constant() {};
    ~Constant() {};

public:
    void foo(void);

public:
    static const int _SIZE;
};

#endif //_CONSTANT_INCUDED_

// END File: Constant.h
</code></pre>
<pre><code>// BEGIN File: Constant.cpp
#include &quot;Constant.h&quot;
#include &lt;stdio.h&gt;

const int Constant::_SIZE = 10;

void Constant::foo(void)
{
    printf(&quot;Size = %i&quot;, Constant::_SIZE);
}

// END File: Constant.cpp
</code></pre>
<p>...und</p>
<pre><code>// BEGIN File main.cpp
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &quot;Constant.h&quot;

void main(void)
{
unsigned char array1[Constant::_SIZE];                      // ERROR: keine Konstante
unsigned char *array2 = new unsigned char[Constant::_SIZE]; // OK

int test = 10;

    switch(test)
    {
        case Constant::_SIZE: // ERROR: keine Konstante
            break;

        case 3:
        default:
            break;
    }

    delete [] array2;
}

// END File: main.cpp
</code></pre>
<p>Habe ich da ein grundliegendes Verständnis problem, oder liegt hier ein Compilerbug vor?</p>
<p>Warum kann ich auf die public static const Konstante in main() nicht als Konstante zugreifen?</p>
<p>Schlimmer wird es, wenn ich Klassen von Constant.cpp ableiten will, die ebenfalls mit der Konstante der Vaterklasse arbeiten müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940904</guid><dc:creator><![CDATA[_DEBUG]]></dc:creator><pubDate>Tue, 17 Aug 2010 10:36:29 GMT</pubDate></item><item><title><![CDATA[Reply to Human Error oder Compiler Bug? on Tue, 17 Aug 2010 10:42:20 GMT]]></title><description><![CDATA[<p>Ich hab jedenfalls ein Verständnisproblem, warum Du VS6 nutzt. Nimm etwas moderneres, VC++ 2010 oder zumindest 2008 SP1</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940907</guid><dc:creator><![CDATA[human error]]></dc:creator><pubDate>Tue, 17 Aug 2010 10:42:20 GMT</pubDate></item><item><title><![CDATA[Reply to Human Error oder Compiler Bug? on Tue, 17 Aug 2010 10:44:39 GMT]]></title><description><![CDATA[<ol>
<li>Es heißt <strong>int</strong> main, nicht void!</li>
<li>&lt;stdio.h&gt; ist veraltet, heißt in C++ &lt;cstdio&gt;, selbes mit stdlib.h.</li>
<li>Führende Unterstriche sind AFAIK dem Compiler vorbehalten, die haben in deinem Code nix zu suchen: _SIZE -&gt; SIZE</li>
<li>Das alles kompiliert im gcc-4.4.3 problemlos, wenn du die obigen Punkte korrigierst und es geht immer noch nicht, ist es wohl ein Compiler-Fehler.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1940909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940909</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 17 Aug 2010 10:44:39 GMT</pubDate></item><item><title><![CDATA[Reply to Human Error oder Compiler Bug? on Tue, 17 Aug 2010 10:54:58 GMT]]></title><description><![CDATA[<p>Compilezeit-Konstanten müssen direkt in der Klasse initialisiert werden. Woher soll der Compiler auch in A.cpp den Wert wissen, wenn er in B.cpp steht?</p>
<p>Der Grund, warum es mit gcc funktioniert, könnte die VLA-Erweiterung für C++ sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940916</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 17 Aug 2010 10:54:58 GMT</pubDate></item><item><title><![CDATA[Reply to Human Error oder Compiler Bug? on Tue, 17 Aug 2010 10:58:28 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<ol start="2">
<li>&lt;stdio.h&gt; ist veraltet, heißt in C++ &lt;cstdio&gt;, selbes mit stdlib.h.</li>
</ol>
</blockquote>
<p>Das ist zwar korrekt, aber wenn er diese Änderungen in VS6 macht, gibt es wahrscheinlich noch mehr Fehler. VS6 wohnt im gleichen Altersheim wie &lt;stdio.h&gt; für C++ <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940922</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 17 Aug 2010 10:58:28 GMT</pubDate></item><item><title><![CDATA[Reply to Human Error oder Compiler Bug? on Tue, 17 Aug 2010 11:00:07 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Compilezeit-Konstanten müssen direkt in der Klasse initialisiert werden. Woher soll der Compiler auch in A.cpp den Wert wissen, wenn er in B.cpp steht?</p>
<p>Der Grund, warum es mit gcc funktioniert, könnte die VLA-Erweiterung für C++ sein.</p>
</blockquote>
<ol>
<li>
<p>Klasse Constant.cpp hat einen Standardkonstruktor, somit gibt es zumindest die Konstante.</p>
</li>
<li>
<p>char *array2 = new char[Constant::_SIZE] funktioniert doch auch!</p>
</li>
<li>
<p>Zu den anderen Beiträgen: Hab das bis einschl VS 2005 ausprobiert</p>
</li>
</ol>
<p>Grüsse</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940923</guid><dc:creator><![CDATA[_DEBUG]]></dc:creator><pubDate>Tue, 17 Aug 2010 11:00:07 GMT</pubDate></item><item><title><![CDATA[Reply to Human Error oder Compiler Bug? on Tue, 17 Aug 2010 11:24:55 GMT]]></title><description><![CDATA[<p>Du brauchst als Arraygröße eine <em>Compilezeitkonstante</em>. Deine <code>Constant:_SIZE</code> ist keine Compilezeitkonstante, sondern einfach eine nichtveränderliche Variable. Symbolische Compilezeitkonstanten kann man erzeugen, indem man sie direkt in der Klasse definiert:</p>
<pre><code class="language-cpp">class Constant {
  static const int SIZE = 42;
};
</code></pre>
<p>Das geht bei älteren Compilern (ich vermute auch beim VC6) aber nicht, deshalb sieht man manchmal auch den enum-Trick:</p>
<pre><code class="language-cpp">class Constant {
  enum { SIZE = 42 };
}; // hoffe die Syntax ist richtig ...
</code></pre>
<p>_DEBUG schrieb:</p>
<blockquote>
<ol start="2">
<li>char *array2 = new char[Constant::_SIZE] funktioniert doch auch!</li>
</ol>
</blockquote>
<p>Was hat das mit irgendwas zu tun? new[] benötigt weder eine Compilezeitkonstante noch überhaupt eine Konstante.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940935</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 17 Aug 2010 11:24:55 GMT</pubDate></item><item><title><![CDATA[Reply to Human Error oder Compiler Bug? on Tue, 17 Aug 2010 11:28:52 GMT]]></title><description><![CDATA[<p>Benutze für ältere Compiler den enum-Workaround (hack!), d.h.</p>
<pre><code class="language-cpp">enum { _SIZE = 10 };
</code></pre>
<p>anstatt</p>
<pre><code class="language-cpp">static const int _SIZE = 10;
</code></pre>
<p>s.a. <a href="http://books.google.de/books?id=8E5P-Sa0SCcC&amp;pg=PA31&amp;lpg=PA31&amp;dq=Myers+enum+workaround&amp;source=bl&amp;ots=Dh5G7uHgwo&amp;sig=2aOaoHg-VScWJU5MAmpt3NQTSII&amp;hl=de&amp;ei=AXJqTL-JC4WBlAeI2eHCAg&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=1&amp;ved=0CBkQ6AEwAA#v=onepage&amp;q&amp;f=false" rel="nofollow">http://books.google.de/books?id=8E5P-Sa0SCcC&amp;pg=PA31&amp;lpg=PA31&amp;dq=Myers+enum+workaround&amp;source=bl&amp;ots=Dh5G7uHgwo&amp;sig=2aOaoHg-VScWJU5MAmpt3NQTSII&amp;hl=de&amp;ei=AXJqTL-JC4WBlAeI2eHCAg&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=1&amp;ved=0CBkQ6AEwAA#v=onepage&amp;q&amp;f=false</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940937</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Tue, 17 Aug 2010 11:28:52 GMT</pubDate></item><item><title><![CDATA[Reply to Human Error oder Compiler Bug? on Tue, 17 Aug 2010 11:29:20 GMT]]></title><description><![CDATA[<p>_DEBUG schrieb:</p>
<blockquote>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>Compilezeit-Konstanten müssen direkt in der Klasse initialisiert werden. Woher soll der Compiler auch in A.cpp den Wert wissen, wenn er in B.cpp steht?</p>
<p>Der Grund, warum es mit gcc funktioniert, könnte die VLA-Erweiterung für C++ sein.</p>
</blockquote>
<ol>
<li>
<p>Klasse Constant.cpp hat einen Standardkonstruktor, somit gibt es zumindest die Konstante.</p>
</li>
<li>
<p>char *array2 = new char[Constant::_SIZE] funktioniert doch auch!</p>
</li>
<li>
<p>Zu den anderen Beiträgen: Hab das bis einschl VS 2005 ausprobiert</p>
</li>
</ol>
<p>Grüsse</p>
</blockquote>
<p>Gesagt, warum Du den alten Compiler überhaupt nutzt, hast Du noch nicht.<br />
Und VS2005 ist zwar wesentlich besser als VC6, aber trotzdem 5 Jahre alt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940938</guid><dc:creator><![CDATA[human error]]></dc:creator><pubDate>Tue, 17 Aug 2010 11:29:20 GMT</pubDate></item><item><title><![CDATA[Reply to Human Error oder Compiler Bug? on Tue, 17 Aug 2010 11:32:48 GMT]]></title><description><![CDATA[<p>[quote=&quot;Bashar&quot;]Du brauchst als Arraygröße eine <em>Compilezeitkonstante</em>. Deine <code>Constant:_SIZE</code> ist keine Compilezeitkonstante, sondern einfach eine nichtveränderliche Variable. Symbolische Compilezeitkonstanten kann man erzeugen, indem man sie direkt in der Klasse definiert:</p>
<p>Das geht bei älteren Compilern (ich vermute auch beim VC6) aber nicht, deshalb sieht man manchmal auch den enum-Trick:</p>
<pre><code class="language-cpp">class Constant {
  enum { SIZE = 42 };
}; // hoffe die Syntax ist richtig ...
</code></pre>
<p>Yep, die zweite Variante scheint zu funktionieren.<br />
Danke für den Tipp <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/1940944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940944</guid><dc:creator><![CDATA[_DEBUG]]></dc:creator><pubDate>Tue, 17 Aug 2010 11:32:48 GMT</pubDate></item><item><title><![CDATA[Reply to Human Error oder Compiler Bug? on Sat, 21 Aug 2010 09:28:59 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<ol start="3">
<li>Führende Unterstriche sind AFAIK dem Compiler vorbehalten, die haben in deinem Code nix zu suchen: _SIZE -&gt; SIZE</li>
</ol>
</blockquote>
<p>Der relevante Teil des Standards liest sich wie folgt:</p>
<p>ISO/IEC 14882:2003 17.4.3.1.2 (1) schrieb:</p>
<blockquote>
<p>— Each name that contains a double underscore (_ _) or begins with an underscore followed by an upper-case letter (2.11) is reserved to the implementation for any use.<br />
— Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.165)</p>
<p>(...)</p>
<ol start="165">
<li>Such names are also reserved in namespace ::std (17.4.3.1).</li>
</ol>
</blockquote>
<p>Also:</p>
<pre><code class="language-cpp">class Constant {
  enum {
    _SIZE = 42, // BÖSE!
    _size = 42  // erlaubt
  };
};

int const _size = 42; // BÖSE!
</code></pre>
<p>Wobei man sich natürlich auch darüber streiten kann, wie guter Stil Constant::_size ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1942657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1942657</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 21 Aug 2010 09:28:59 GMT</pubDate></item><item><title><![CDATA[Reply to Human Error oder Compiler Bug? on Sat, 21 Aug 2010 12:05:16 GMT]]></title><description><![CDATA[<p>Hachja, VS 6 Autorenedition und Text-RPGs.<br />
Das waren noch Zeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1942733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1942733</guid><dc:creator><![CDATA[Melancholy]]></dc:creator><pubDate>Sat, 21 Aug 2010 12:05:16 GMT</pubDate></item></channel></rss>