Enmus mit nur einem Element



  • /rant/ schrieb:

    Einige alte Compiler akzeptieren an dieser Stelle kein const int ... 💡

    Es steckt schon noch etwas mehr dahinter.

    Wenn man den Meyers gerade nicht zur Hand hat kann man auch Google mit den Stichwörtern Enum Hack füttern.

    Die Seite hinter folgendem Link schneidet meiner Meinung nach die wichtigsten Dinge dazu an:

    http://stackoverflow.com/questions/204983/static-const-member-value-vs-member-enum-which-method-is-better-why



  • Kritiker schrieb:

    /rant/ schrieb:

    Einige alte Compiler akzeptieren an dieser Stelle kein const int ... 💡

    Es steckt schon noch etwas mehr dahinter.

    nö.



  • volkard schrieb:

    Kritiker schrieb:

    /rant/ schrieb:

    Einige alte Compiler akzeptieren an dieser Stelle kein const int ... 💡

    Es steckt schon noch etwas mehr dahinter.

    nö.

    so wie ich den link verstanden habe: doch



  • volkard schrieb:

    nö.

    Ah, das sind die Antworten, die ich liebe. Kurz, prägnant und lehrreich. 😉
    Jetzt weiß sicher jeder Bescheid und die Unklarheiten sind beseitigt.
    Danke volkard! 😡 😡 😡



  • volkard schrieb:

    Kritiker schrieb:

    /rant/ schrieb:

    Einige alte Compiler akzeptieren an dieser Stelle kein const int ... 💡

    Es steckt schon noch etwas mehr dahinter.

    nö.

    ACK

    ----

    Leute die die Frage nicht verstehen sollten nicht antworten. Der Grund warum hier ein enum verwendet wird ist nur weil "static const" mit einigen Compilern nicht geht. Die anderen Unterschiede zwischen enum und "static const" spielen hier überhaupt keine Rolle.
    Wer etwas anderes behauptet soll es begründen!



  • Kritiker schrieb:

    volkard schrieb:

    nö.

    Ah, das sind die Antworten, die ich liebe. Kurz, prägnant und lehrreich. 😉
    Jetzt weiß sicher jeder Bescheid und die Unklarheiten sind beseitigt.
    Danke volkard! 🙂 🙂 🙂

    och, ich wollte doch nur den thread dahingehend ein wenig beeinflussen, daß da keine schattenlehre entsteht um die geheimnisse des mystischen enum-hacks und welche der varianten man wo nehmen soll. dein posting schien anzudeuten, daß da was großes dahintertsteckt, aber ist ja nicht so. struppi sagte damals zur frage, warum static const nicht von vornherein eingebaut war "ups, das hab ich schlicht vergessen".
    viel mehr als "nö" ist da doch nicht zu sagen, oder?



  • hustbaer schrieb:

    Leute die die Frage nicht verstehen sollten nicht antworten.

    Netter Vorschlag, denn jeder weiß vor seiner Antwort bereits ober er die Frage verstanden hat. 😉

    hustbaer schrieb:

    Der Grund warum hier ein enum verwendet wird ist nur weil "static const" mit einigen Compilern nicht geht.

    Das ist nur die halbe Wahrheit. Und was soll "hier" bedeuten? Du kennst den Rest des Programms doch überhaupt nicht.

    hustbaer schrieb:

    Die anderen Unterschiede zwischen enum und "static const" spielen hier überhaupt keine Rolle.

    Anhand der zwei Zeilen kannst du das nicht beurteilen. Es kann eine Rolle spielen oder auch nicht.

    hustbaer schrieb:

    Wer etwas anderes behauptet soll es begründen!

    Siehe z.B. Link aus meinem ersten Post. Oder jedem anderen AUSFÜHRLICHEN Kommentar zu "Enum Hack".

    volkard schrieb:

    viel mehr als "nö" ist da doch nicht zu sagen, oder?

    Vielleicht noch eine Begründung? 🙂
    Keiner sagt etwas von Schattenlehre, aber alleine mit dem static const ist es auch nicht erklärt. Selbst wenn das in den allermeisten Fällen ausreicht.



  • Ach Kritiker, wenn du glaubst 🙄



  • hustbaer schrieb:

    Ach Kritiker, wenn du glaubst 🙄

    @volkard + hustbaer

    Da ihr ja scheinbar einsilbig bleibt. Liegt es an mir eine Geschichte zu konstruieren die (vielleicht auch euch) zeigt, dass es durchaus Sinn macht den enum-hack statt static const zu verwenden.

    Wie im Meyers und in vielen anderen Quellen erläutert belegt die static const Variante eben auch Speicher der adressiert und dessen Inhalt somit verändert werden kann. Der Compiler optimiert es weg, aber nur wenn der Speicher auch tatsächlich nicht adressiert wird.

    Angenommen die Konstruktion

    enum { ARRAY_SIZE = 5 };
    int data[ARRAY_SIZE];
    //...
    Player Teilnehmer[ARRAY_SIZE];
    

    kommt in einem von einem Lehrer vorgegebnen Testprogramm vor, wobei Player die Oberklasse eines Spielers darstellt, der von jedem Schüler zu implementieren ist.

    Der Lehrer fügt die jeweiligen Quelltexte ein, passt die Anzahl der Teilnehmer am Spiel mit Hilfe von ARRAY_SIZE an, übersetzt und und startet.

    Hab ich statt

    enum { ARRAY_SIZE = 5 };
    

    im Quelltext

    static const size_t ARRAY_SIZE = 5;
    

    stehen, und ist diese Zahl z.B. auch noch wichtig beim Ausrechnen eines Spielzuges, kann ein Spieler hingehen und die Zahl nach seinen Wünschen im richtigen Augenblick manipulieren, ohne dass jemand es merkt.

    Eure Aussagen waren allgemeiner Natur und das hier ist ein Gegenbeispiel, daher schreib ich mal offensiv q.e.d. darunter. 🙂

    Natürlich ist es auch möglich, dass ich auf der Leitung stehe, aber ihr macht euch ja nicht die Mühe etwas zu erklären. 😉



  • interresantes beispiel.
    also könnte man damit aus der main() heraus eine memberfunktion vergiften? kannste ein kleines beispiel machen, wo das klappt?



  • @volkard:
    Beispiel sollte recht einfach zu machen sein...

    // entity.hpp:
    
    class Entity
    {
    public:
        void SetSpeed(int const& speed); // warum auch immer by-reference (man könnte sich vermutlich 
                                         // schlauere Beispiele überlegen wo es ne ref/pointer sein *muss*)
    
        // ...
    };
    
    // foo.hpp:
    
    #include <entity.hpp>
    
    class Foo : public Entity
    {
    public:
        static int const FOO_SPEED = 123;
    
        Foo() // gehen wir man davon aus der compiler tut das nicht inlinen
        {
            SetSpeed(FOO_SPEED);
        }
    };
    
    //poese.cpp:
    #include <foo.hpp>
    
    int main()
    {
        int const& foo_speed = Foo::FOO_SPEED;
        const_cast<int&>(foo_speed) = 100000; // <- pöse!
    
        Foo fast_foo; // <- geschummelt!!!
    }
    

    @Kritiker:
    Ich verstehe durchaus was du sagst, und den Unterschied zwischen enum und (static) const. Ich habe nur noch nirgends ein enum aus diesem Grund verwendet gesehen. IMO sind diese Bedenken Paranoia pur. Wenn ich an einem Steuerungssystem für Flugzeuge arbeite würde ich sowas vielleicht berücksichtigen. Bloss... solche Systeme programmiert man üblicherweise nicht in C++.

    Ich habe die Frage einfach so verstanden: "Warum würde jemand üblicherweise hier ein enum statt static const nehmen". Und die Antwort darauf ist und bleibt einfach "weil manche Compiler ein static const hier nicht verstehen". Was du hier alles zu dem Thema enum vs. const verlinkst/erzählst ist schon richtig, bloss interessiert es in der Praxis kaum jemanden. D.h. die Antwort bleibt trotzdem "weil manche Compiler ein static const hier nicht verstehen".

    Zeig mir ein einziges Beispiel, ein Stück Code in einem Programm, wo du zumindest glaubhaft machen kannst, dass der Author andere Gründe hatte. OK, abgesehen von "weil der Author garnicht wusste dass es mit static const auch ginge".

    Ich kann dir auf jeden Fall viele Stellen zeigen wo enum deswegen genommen wurde, weil z.B. VC6 aber auch andere Compiler mit static const Zahnräder spucken würden.



  • hat das beispiel auch funktioniert? gab es eine ausgabe, die trotz static int const FOO_SPEED = 123; was anderes auf den bildschrim schreiben tat?

    edit: auch egal. das zwangsläufige "ub" ist ja auch nicht länger als "nö". ein teufelskreis.


Anmelden zum Antworten