initializer element is not constant


  • Mod

    Apeman schrieb:

    du hättest etwas weiter lesen sollen:

    const promises very little. Const is not a synonym with "immutable"
    ...
    There can be, of course, non-const pointers to the object which can mutate the object. (And of course, you can always create such a pointer with by CastingAwayConst).
    ...
    The ConstQualifier's main purpose is HelpingTheCompiler; it has almost zero use in describing the user's problem.

    oder anders: const != konstant
    --> http://c2.com/cgi/wiki?PhysicalConst
    🙂

    Wichtiger noch: du solltest nicht wesentliche Teile durch Punkte ersetzen.

    const promises very little. Const is not a synonym with "immutable"

    Der wichtige Teil kommt danach (da dort nur noch von Referenzen und Pointern geredet wird). Ein top-level const-Qualifizierer bedeutet immer immutable. Aber das gehört sowieso nicht in dieses Forum.



  • camper schrieb:

    Wichtiger noch: du solltest nicht wesentliche Teile durch Punkte ersetzen.

    ...was aber die bedeutung der von mir zitierten sätze nicht schmälert 😉

    camper schrieb:

    Ein top-level const-Qualifizierer bedeutet immer immutable.

    meinst du in C++? ok, dann sollte ein 'const_cast' auf ein solches objekt in C++ bestimmt undefiniert sein, oder? (und ein guter C++ compiler sollte einen error melden, nehme ich mal an).

    btw: auch ich verwende 'const' (in C), um objekte in einen read-only bereich zu verfrachten. aber glaub' mir, ich schaue danach im linker -.map file nach, ob es auch wirklich geklappt hat. sobald mir ein compiler etwas wie '#pragma INTO_ROM' oder ähnliches anbietet, ziehe ich das einem 'const' allemal vor.
    🙂



  • Apeman schrieb:

    ne, eben nicht. das hier:

    const int not_const = 123;
    
    int main ()
    {
        *(int*)&not_const = 456; 
    }
    

    sollte in C und C++ compilieren, aber es wird sehr wahrscheinlich crashen (undefiniert). in C++, mit einem const_cast<int> statt (int) versehen, wär' der code womöglich sogar okay .
    dagegen bieten #defines und enums keine möglichkeit für solche faxen. darum sind sie wirklich 'const'
    🙂

    Da hast Du insofern Recht, als dass man von einer solchen Konstanten anders als beim enum die Adresse nehmen darf. Aber wie Camper und Du anschließend auch schon feststellten, darf man dieser Adresse das const nicht wegcasten, das ist undefiniert. Const wegcasten ist nur definiert wenn das eigentliche Objekt non-const ist (und z.B. an eine const Referenz gebunden wurde).

    Darüberhinaus kann man sich im Assembler davon überzeugen, dass solche Konstanten tatsächlich durch ihre Werte ersetzt werden, wenn man sie im Code als Wert benutzt (also nicht ihre Adresse nimmt).


Anmelden zum Antworten