Warum is folgende Anweisung nicht constant?



  • Hallo NG,

    ich definiere mir gerade einige Werte. Aber bei einigen meint der Compiler:

    error: initializer element is not constant

    Die entsprechenden Zeilen sehen so aus:

    const unsigned int   BASE    =  0x10000000;
    const unsigned int   SPECIAL =  0x00000001 + BASE; // Das wird angemeckert
    

    Gruß,
    M. Incani



  • Bei mir gehts ohne Probleme.
    Compiler?



  • visual studio



  • Das glaube ich nicht. Ich hab gcc 4.2.1 und die Anweisung widerspricht keiner Logik. Und der gcc Aufruf aus Kdevelop heraus lautet:

    gcc -c -pipe -O2 -march=i586 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -g -fno-strict-aliasing -Wall -W -g -I/usr/lib/qt3/mkspecs/default -I. -I/usr/include -o myfile.o myfile.c

    Daran ist auch nichts unerlaubtes.

    Gruß,
    M.Incani

    simon.gysi schrieb:

    Bei mir gehts ohne Probleme.
    Compiler?



  • Warum stellst Du diese Frage im C++-Forum, wenn Du ein C-Programm hast? 🙄

    Diese Art von konstanten Initialisierern gibt es in C nicht. Anders gesagt ist BASE keine Compilezeit-Konstante und kann damit nicht zur statischen Initialisierung verwendet werden.



  • bevor du jetzt fragst "wieso C-Programm, das ist ein C++-Programm":
    gcc, aufgerufen mit einem Source file mit der Endung .c nimmt an, dass es sich um C handelt. Entwerder musst du explizit g++ aufrufen, oder (besser) deine Source-Files den Konventionen entsprechend in .C (grosses C), .cpp, .cxx oder aehnlich umbenennen



  • Das sind C-Files die aus einer Library stammen. Die müssen in C sowie auch C++ eingebunden werden. Bisher standen dort defines und die sollten in const umgewandelt werden. Bisher sah das so aus:

    #define   BASE     (0x10000000)
    #define   SPECIAL  (0x00000001 + BASE)
    

    So wie es klingt weißt Du wie es richtig gehen müßte. Wäre nett, wenn Du mir hilfst.

    Gruß,
    M. Incani

    LordJaxom schrieb:

    Warum stellst Du diese Frage im C++-Forum, wenn Du ein C-Programm hast? 🙄

    Diese Art von konstanten Initialisierern gibt es in C nicht. Anders gesagt ist BASE keine Compilezeit-Konstante und kann damit nicht zur statischen Initialisierung verwendet werden.



  • In C geht das so nicht. Da wirst Du weiterhin auf defines zurückgreifen müssen. Es gibt da noch den Enum-Hack, der auch in C funktioniert, allerdings ist der Typ der einzelnen Werte dann nicht zwingend "unsigned int".

    enum Constants
    {
        BASE = 0x10000000,
        SPECIAL = BASE + 1
    };
    


  • Ok, Danke!

    Ohne unsigned kann ich auch leben.

    Gruß,
    M.Incani

    LordJaxom schrieb:

    In C geht das so nicht. Da wirst Du weiterhin auf defines zurückgreifen müssen. Es gibt da noch den Enum-Hack, der auch in C funktioniert, allerdings ist der Typ der einzelnen Werte dann nicht zwingend "unsigned int".

    enum Constants
    {
        BASE = 0x10000000,
        SPECIAL = BASE + 1
    };
    

Anmelden zum Antworten