constanten und static definition Problem

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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.