www.mikrocontroller.net

Forum: Compiler & IDEs Unterschied static & global


Autor: abcd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!!

Wer kann mir in wenigen Sätzen sagen was genau der Unterschied zwischen 
einer Variable die global (also außerhalb jeder Funtkion) definiert ist 
und einer die als static definiert ist?


DANKE!

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
global ist global sichtbar.

static ist nur in der eigenen Kompilierungseinheit (= Sourcefile) 
sichtbar.

Oliver

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abcd schrieb:
> Hallo!!
>
> Wer kann mir in wenigen Sätzen sagen was genau der Unterschied zwischen
> einer Variable die global (also außerhalb jeder Funtkion) definiert ist
> und einer die als static definiert ist?

Exakt kommt es darauf an, welche Verwendung von stativ dir genau 
vorschwebt (Es gibt deren 2). Aber im Allgemeinen (und wenn man es nicht 
100% genau nimmt) kann man sagen: static beeinflusst den Scope einer 
Variablen, beschänkt also die Sichtbarkeit von aussen.

Autor: Murkser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

die Antwort ist soweit schon richtig, aber etwas unvollständig. Die 
Antwort scheint sich auf C zu beziehen. Dort gibt es allerdings mehrere 
Bedeutungen von dem Keyword "static" und nur eine davon bezieht sich auf 
die Sichtbarkeit ("Scope") einer Variablen in einer Übersetzungseinheit 
("Translation Unit" gemeinhin auch Datei). In C gibt es wiederum kein 
Keyword "global", sondern Variablen können die Eigenschaft haben, 
globalen Scope zu besitzen (wenn sie eben nicht "static" in dem Sinne 
einer eingeschränkten Sichtbarkeit in nur einer Translation Unit sind). 
Und dann gibt es ja noch "static" als Eigenschaft einer lokalen 
Variable, deren Wert über die Dauer eines Funktionsaufrufs hinweg 
behält. Wie so oft, in C ist das alles ein wenig unsauber...

Murkser

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerhalb einer Funktion static deklarierte Dinge sind nur innerhalb 
der Übersetzungseinheit (i.d.R. des jeweiligen Sourcecode-Files) 
"sichtbar".

Der Linker bekommt die entsprechenden Symbole nicht zu gesicht, deswegen 
ist ein Zugriff auf etwas als static deklariertes aus einer anderen 
Übersetzungseinheit heraus nicht möglich.

Das betrifft sowohl Variablen als auch Funktionen.

Die andere Anwendungsart von static betrifft nur Variablen innerhalb 
von Funktionen. Nicht mit static deklarierte Variablen werden als 
automatische Variablen auf dem Stack angelegt und verlieren ihre 
Gültigkeit mit dem Verlassen der Funktion. Eine als static angelegte 
Variable ist zwar auch nur innerhalb der Funktion "sichtbar", verliert 
aber beim Verlassen der Funktion nicht ihre Gültigkeit, so daß darin 
gespeicherte Werte bei einem erneuten Funktionsaufruf wieder zur 
Verfügung stehen.

Autor: abcd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Danke erstmals!

Wie kann man sich die von euch genannte "Sichtbarkeit" vorstellen?

Den Unterschied zwischen einer globalen Variable (also außerhalb einer 
Funktion) und einer static Variable (außerhalb einer Funktion) verstehe 
ich nicht ganz.

Auf beide kann doch innerhalb jeder Funktion (die im selben File ist) 
zugegriffen werden, oder?

Und beide haben doch einen fixen Speicherort!!??

Autor: Murkser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, aber auf die global deklarierte Variable kannst Du aus einem anderen 
File zugreifen, auf die als static deklarierte nicht!

Murkser

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abcd schrieb:
> Hallo!
> Danke erstmals!
>
> Wie kann man sich die von euch genannte "Sichtbarkeit" vorstellen?

Sie sagt ganz einfach aus, ob es eine Möglichkeit gibt, diese Variable 
(Funktion) zu benutzen, weil sie ansprechbar ist.

Ist eine Variable für eine Codestelle nicht sichtbar, kann sie auch 
nicht benutzt werden. Für alle Codestellen ausserhalb des Sichtbereiches 
ist es so, als ob diese Variable nicht existieren würde.

> Den Unterschied zwischen einer globalen Variable (also außerhalb einer
> Funktion) und einer static Variable (außerhalb einer Funktion) verstehe
> ich nicht ganz.
>
> Auf beide kann doch innerhalb jeder Funktion (die im selben File ist)
> zugegriffen werden, oder?

Ja.
Aber was ist mit Funktionen die in anderen Files sind?

Autor: abcd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Ja.
> Aber was ist mit Funktionen die in anderen Files sind?

Was meinst du?
Funktionen und Variablen die in anderen Files sind müssen in irgend 
einer header doch eh als extern deklariert werden??

Rein durch eine static deklaration kann ich noch nicht auf Variablen 
anderer Files zugreifen

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abcd schrieb:
> Karl heinz Buchegger schrieb:
>> Ja.
>> Aber was ist mit Funktionen die in anderen Files sind?
>
> Was meinst du?
> Funktionen und Variablen die in anderen Files sind müssen in irgend
> einer header doch eh als extern deklariert werden??

Sagt wer?


a.c
****
#include "foo.h"

static int meine_file_globale_Variable;

int foo()
{
  meine_file_globale_Variable = 5;
}

void bar()
{
  meine_file_globale_Variable = 8;
}


meine_file_globale_Variable existiert nur im Kontext von a.c
Alle Funktionen in a.c sehen sie und können sie benutzen.
Ausserhalb von a.c ist die Variable aber nicht sichtbar und keine andere 
Funktion kann sich darauf referenzieren.

> Rein durch eine static deklaration kann ich noch nicht auf Variablen
> anderer Files zugreifen

Nein.
Genau das willst du ja mit dem static verhindern!
Du willst eine globale Variable, die nur in diesem einen C-File sichtbar 
ist. Und du willst auch verhindern, dass sich irgendein anderer Code mit 
einer 'extern' Deklaration auf diese Variable beziehen kann. 
meine_file_globale_Variable existiert nicht ausserhalb von a.c! Es ist 
nicht möglich ausserhalb von a.c auf diese Variable zuzugreifen.

b.c
****
#include "foo.h"

extern int meine_file_globale_Variable;

Möööp. Das geht nicht. meine_file_globale_Variable existiert nicht 
ausserhalb von a.c. Daher kannsich b.c keinen Zugriff auf diese Variable 
verschaffen. Noch nicht mal wenn es wirklich unbedingt will.

Denk zb an ein Modul, welches eine Warteschlange repräsentiert und 
Funktionen dafür zur Verfügung stellt. Dieses Modul hat für sich ein 
paar Variablen, die zwar in allen Funktionen benutzt werden, aber 
ausserhalb dieses Moduls gehen diese Variablen keinen was an.
-> perfekter Kandidat für static Variablen auf File Scope.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.