Forum: Compiler & IDEs Fehler: multiple storage classes in declaration specifiers


von Joachim (Gast)


Lesenswert?

Hallo,
hab n Problem:

In Datei main.c:
1
volatile int8_t enc_delta;          // -128 ... 127
2
static int8_t last;
3
4
void main (void )
5
{
6
}


und in Datei Drehgeber.c:
1
extern volatile int8_t enc_delta;          // -128 ... 127
2
extern static int8_t last;
3
4
void encode_init( void )
5
{ 
6
 new ^= 1;                   // convert gray to binary
7
}

liefert:
multiple storage classes in declaration specifiers


Was kann man da machen

von Stefan E. (sternst)


Lesenswert?

Joachim schrieb:
> Was kann man da machen

Nachlesen, welche Bedeutung "static" bei globalen Variablen hat und 
warum deshalb "extern static" Quatsch ist (und die Fehlermeldung 
produziert).

von Joachim (Gast)


Lesenswert?

Da schrieb jemand in einem älteren Thread:
static - Wenn du eine globale Variable mit static deklarierst, ist diese
nur innerhalb der Übersetzungseinheit, also in dem c-file wo du diese
anlegst sichtbar. Ausserhalb der Übersetzungseinheit kann auf diese
Variable nicht zugegriffen werden.

Klar.
Aber was macht ich wenn ich die Variable in einer anderen Datei brauche?

von (prx) A. K. (prx)


Lesenswert?

Dann machst du sie eben nicht static.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Joachim schrieb:

>  new ^= 1;                   // convert gray to binary

undefined variable: new

von Joachim (Gast)


Lesenswert?

Daran liegts nicht, kam durch c&p in den Thread.

von cskulkw (Gast)


Lesenswert?

Joachim schrieb:
> Da schrieb jemand in einem älteren Thread:
>
> static - Wenn du eine globale Variable mit static deklarierst, ist diese
>
> nur innerhalb der Übersetzungseinheit, also in dem c-file wo du diese
>
> anlegst sichtbar. Ausserhalb der Übersetzungseinheit kann auf diese
>
> Variable nicht zugegriffen werden.
>
>
>
> Klar.
>
> Aber was macht ich wenn ich die Variable in einer anderen Datei brauche?

Eine Schnittstellenfunktion schreiben, die als Rückgabeparameter jene 
besagte static-Variable dem Aufrufer der anderen Übersetzungseinheit 
kopiert?

Das nennt man Datenkapselung und kommt aus der Objekt orientierten 
Programmierung.

/* Schnittstelle für Zugriff auf Static Variable */
z. B. uint8 GetStaticVariableFromKomponente(void);

uint8 GetStaticVariableFromKomponente(void)
{
return StaticVariable;
}

Die Funktion "GetStaticVariableFromKomponente" muß dann ebenfalls in der 
gleichen C-Datei sich befinden, wo die Static Variable deklariert ist.

In der Header-Datei dieser C-Datei wird dann über

extern GetStaticVariableFromKomponente(void);

der Zugrif öffentlich gemacht.

Man kann sie auch in der verwendeteten anderen C-Datei eintragen. Das 
wird mit zunehmender Komplexität unübersichtlich.

Vielleicht hilft mein Vorschlag weiter. Viel Erfolg

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Joachim schrieb:
> Daran liegts nicht, kam durch c&p in den Thread.

Dann poste bitte etwas, was in sich geschlossen compilierfähig ist
und die von dir genannte Fehlermeldung beim Compilieren ausspuckt.

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.