Forum: Compiler & IDEs constanten und static definition Problem


von Vlad T. (vlad_tepesch)


Lesenswert?

Hi,
warum will der AVR-gcc folgendes nicht:
1
void fun(void)
2
{
3
    static const uint16_t c_datalen     = 500;  /**< loggin buffer size */
4
    static uint8_t s_data[c_datalen]; /**< logging buffer */ 
5
6
   // more code
7
}

da kommt nur die meldung:
error: storage size of 's_data' isn't constant

sieht für mich aber sehr konstant aus!

Ich verwende lieber constanten als #defines.

Bin mir ziemlich sicher, dass andere Compiler das akzeptieren.

ist das ein gcc-Bug?

Gruß,
vlad

edit:code

von Peter (Gast)


Lesenswert?

nein, es geht geht nicht.

Es könnte höchstes sein, das nach dem neuen Standard innerhalb ein 
Funktion geht. Aber genau es dem Grund gibt es ja defines.

von Alex (Gast)


Lesenswert?

Mit const hat so ziemlich jeder Compiler so sein tun ...

Ich habe auch schon versucht eine Komponente "ordentlich" zu schreiben, 
indem ich defines durch const ... Ausdrücke ersetzt habe, spätestens bei 
switch-case Anweisungen fliegt man damit aber auch bei den meisten 
Compilern auf die Nase.

Warum sollte man const anstelle eines define verwenden?
1. type-safety
2. Debugging (im Debugger werden die Werte einer Variable angezeigt)

Gleiches gilt für Makros.

von (prx) A. K. (prx)


Lesenswert?

In C sind "const" Daten unveränderliche Variablen, aber nicht äquivalent 
zu lexikalischen Konstanten. Wo immer die C-Sprache einen konstanten 
Ausdruck verlangt sind konstante Variablen nicht verwendbar.

So ist C definiert. Wer das unlogisch findet, der möge sich bei den 
ANSI-Komitees für C89 und C99 beschweren, oder auf C++ umsteigen.

von Rolf Magnus (Gast)


Lesenswert?

> Mit const hat so ziemlich jeder Compiler so sein tun ...

Naja, er muß es eben so machen, wie es in der C-Norm definiert ist.

> Ich habe auch schon versucht eine Komponente "ordentlich" zu schreiben,
> indem ich defines durch const ... Ausdrücke ersetzt habe, spätestens bei
> switch-case Anweisungen fliegt man damit aber auch bei den meisten
> Compilern auf die Nase.

Bei allen konformen C-Compilern. Bei C++ ist es was anderes. Da ginge 
das.

von Vlad T. (vlad_tepesch)


Lesenswert?

also doch enums oder defines ;(

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.