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!
global ist global sichtbar. static ist nur in der eigenen Kompilierungseinheit (= Sourcefile) sichtbar. Oliver
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.
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
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.
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!!??
Ja, aber auf die global deklarierte Variable kannst Du aus einem anderen File zugreifen, auf die als static deklarierte nicht! Murkser
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.