Human Error oder Compiler Bug?



    1. Es heißt int main, nicht void!
    2. <stdio.h> ist veraltet, heißt in C++ <cstdio>, selbes mit stdlib.h.
    3. Führende Unterstriche sind AFAIK dem Compiler vorbehalten, die haben in deinem Code nix zu suchen: _SIZE -> SIZE
    4. 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.


  • 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?

    Der Grund, warum es mit gcc funktioniert, könnte die VLA-Erweiterung für C++ sein.


  • Administrator

    l'abra d'or schrieb:

    1. <stdio.h> ist veraltet, heißt in C++ <cstdio>, selbes mit stdlib.h.

    Das ist zwar korrekt, aber wenn er diese Änderungen in VS6 macht, gibt es wahrscheinlich noch mehr Fehler. VS6 wohnt im gleichen Altersheim wie <stdio.h> für C++ 🙂

    Grüssli



  • LordJaxom schrieb:

    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?

    Der Grund, warum es mit gcc funktioniert, könnte die VLA-Erweiterung für C++ sein.

    1. Klasse Constant.cpp hat einen Standardkonstruktor, somit gibt es zumindest die Konstante.

    2. char *array2 = new char[Constant::_SIZE] funktioniert doch auch!

    3. Zu den anderen Beiträgen: Hab das bis einschl VS 2005 ausprobiert

    Grüsse



  • Du brauchst als Arraygröße eine Compilezeitkonstante. Deine Constant:_SIZE ist keine Compilezeitkonstante, sondern einfach eine nichtveränderliche Variable. Symbolische Compilezeitkonstanten kann man erzeugen, indem man sie direkt in der Klasse definiert:

    class Constant {
      static const int SIZE = 42;
    };
    

    Das geht bei älteren Compilern (ich vermute auch beim VC6) aber nicht, deshalb sieht man manchmal auch den enum-Trick:

    class Constant {
      enum { SIZE = 42 };
    }; // hoffe die Syntax ist richtig ...
    

    _DEBUG schrieb:

    1. char *array2 = new char[Constant::_SIZE] funktioniert doch auch!

    Was hat das mit irgendwas zu tun? new[] benötigt weder eine Compilezeitkonstante noch überhaupt eine Konstante.





  • _DEBUG schrieb:

    LordJaxom schrieb:

    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?

    Der Grund, warum es mit gcc funktioniert, könnte die VLA-Erweiterung für C++ sein.

    1. Klasse Constant.cpp hat einen Standardkonstruktor, somit gibt es zumindest die Konstante.

    2. char *array2 = new char[Constant::_SIZE] funktioniert doch auch!

    3. Zu den anderen Beiträgen: Hab das bis einschl VS 2005 ausprobiert

    Grüsse

    Gesagt, warum Du den alten Compiler überhaupt nutzt, hast Du noch nicht.
    Und VS2005 ist zwar wesentlich besser als VC6, aber trotzdem 5 Jahre alt.



  • [quote="Bashar"]Du brauchst als Arraygröße eine Compilezeitkonstante. Deine Constant:_SIZE ist keine Compilezeitkonstante, sondern einfach eine nichtveränderliche Variable. Symbolische Compilezeitkonstanten kann man erzeugen, indem man sie direkt in der Klasse definiert:

    Das geht bei älteren Compilern (ich vermute auch beim VC6) aber nicht, deshalb sieht man manchmal auch den enum-Trick:

    class Constant {
      enum { SIZE = 42 };
    }; // hoffe die Syntax ist richtig ...
    

    Yep, die zweite Variante scheint zu funktionieren.
    Danke für den Tipp 🙂



  • l'abra d'or schrieb:

    1. Führende Unterstriche sind AFAIK dem Compiler vorbehalten, die haben in deinem Code nix zu suchen: _SIZE -> SIZE

    Der relevante Teil des Standards liest sich wie folgt:

    ISO/IEC 14882:2003 17.4.3.1.2 (1) schrieb:

    — 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.
    — Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.165)

    (...)

    1. Such names are also reserved in namespace ::std (17.4.3.1).

    Also:

    class Constant {
      enum {
        _SIZE = 42, // BÖSE!
        _size = 42  // erlaubt
      };
    };
    
    int const _size = 42; // BÖSE!
    

    Wobei man sich natürlich auch darüber streiten kann, wie guter Stil Constant::_size ist.



  • Hachja, VS 6 Autorenedition und Text-RPGs.
    Das waren noch Zeiten.


Anmelden zum Antworten