Forum: Compiler & IDEs Unterschied static & global


von abcd (Gast)


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!

von Oliver (Gast)


Lesenswert?

global ist global sichtbar.

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

Oliver

von Karl H. (kbuchegg)


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.

von Murkser (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von abcd (Gast)


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!!??

von Murkser (Gast)


Lesenswert?

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

Murkser

von Karl H. (kbuchegg)


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?

von abcd (Gast)


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

von Karl H. (kbuchegg)


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
****
1
#include "foo.h"
2
3
static int meine_file_globale_Variable;
4
5
int foo()
6
{
7
  meine_file_globale_Variable = 5;
8
}
9
10
void bar()
11
{
12
  meine_file_globale_Variable = 8;
13
}


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
****
1
#include "foo.h"
2
3
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.

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.