constanten und static definition Problem

OP #1515246
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
Gast #1515319
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.
#1515332
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.
Gast #1515334
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren