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 angemeckertGruß,
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.Incanisimon.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. IncaniLordJaxom 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.IncaniLordJaxom 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 };