Warum nicht immer gleich static!?
-
Also einfach gesagt sind Globale Variablen standard mässig statisch, wenn nun aber mehrere gleichnamige vorkommen, werden die mit static gekennzeichneten Variablen für den Zugriff ausserhalb der Unit unzugänglich, oder?
-
static_magic schrieb:
Badestrand: Dein IMHO zeigt aber eigentlich das mein erstes Posting doch stimmt

Weil genau das ergibt den Effekt, das wenn dann eine der Variable statisch ist, kein zugriff ausserhalb der Unit möglich ist.
Äh ja, genau! Ich weiß auch nicht, warum das so wenig verbreitet ist. Na gut, anonyme Namespaces gibt's manchmal (die ja quasi alles innerhalb "static" setzen). Ich deklariere jedenfalls immer schön als internal-linkage wenn nicht explizit anders gebraucht.
edit:
Also einfach gesagt sind Globale Variablen standard mässig statisch, wenn nun aber mehrere gleichnamige vorkommen, werden die mit static gekennzeichneten Variablen für den Zugriff ausserhalb der Unit unzugänglich, oder?
Also soweit ich weiß sind statische globale Variablen/Funktionen immer unzugänglich von außen.
-
static_magic schrieb:
drakon schrieb:
Globale Variablen und Funktionen sind immer statisch. Es wäre unnötig und redundant da noch ein static hinzuschreiben.
Oh, Du hast Recht!
Vorsicht: Die Bedeutung von
staticist überladen, wie ich schon erwähnte. Du schmeißt Speicherklassen (storage class) mit Bindung (linkage) durcheinander.Gruß,
SP
-
static_magic schrieb:
Also einfach gesagt sind Globale Variablen standard mässig statisch
Bullshit. Sie haben standardmäsig nur eine statische Speicherklasse. Das hat aber mit "static" nichts mehr zu tun. (!!!)
Gruß,
SP
-
Okay jetzt gibt es verwirrung. Ich habe das nun getestet und das Ergebnis meines Tests zeigt mir doch, dass ich von anfang an Recht hatte. Globale Variablen welche static gekennzeichnet sind, egal ob nur eine einzige mit diesem Namen, sind IMMER unzugänglich (Linker Fehler). Demnach stimmt meiner Meinung nach die Aussage von drakon nicht, von Badestrand ja.
Also sind Globale Variablen nicht automatisch Statisch sondern eher Auto. Jemand anderer Meinung?

-
Sebastian was ist für dich denn eine Speicherklasse? Kleines Beispiel?
-
Wahrscheinlich meinte drakon genau das (also auto-Speicherklasse), hat aber kurz die semantischen Unterschiede von
staticdurcheinandergeworfen.
-
Badestrand schrieb:
Wahrscheinlich meinte drakon genau das (also auto-Speicherklasse), hat aber kurz die semantischen Unterschiede von
staticdurcheinandergeworfen.Genau.
Allerdings muss ich zugeben, dass ich static für die linkage nie gebraucht habe und mir dessen gar nicht mehr bewusst war.
-
Die Speicherklasse beeinflusst die Lebenszeit eines Objektes, also wann es anfängt und wann es wieder aufhört zu existieren. Die Bindung sagt etwas über die Sichtbarkeit von Funktionen und Objekten, die im Namensraum deklariert wurden und IMMER eine "statische Lebenszeit" besitzen. "static" auf Namensraumebene beeinflusst NICHT die Speicherklasse, sondern die Bindung (--> internal linkage, Objekt/Funktion nicht in anderen Übersetzungseinheiten über den Namen sichtbar). "static" in Funktionskörpern beeinflusst die Speicherklasse (von auto nach statisch).
-
Das
staticals Linkage Spezifizierer wird sogar (nach Stroustrup) als missbilligtes Sprachmittel angeschaut, welches vor allem aus Gründen der Kompatibiliät noch vorhanden ist. Die Alternative, die genannt wird, sind anonyme Namensräume, was ich auch als viel logischer und verständlicher empfinde, da man ja genau so etwas erreichen will.
-
drakon: Also meintest du eigentlich nur das eine Globale Variable die wie folgt deklariert wurde:
int i;
eine Statische Lebenszeit hat, aber nicht static ist? Oder verwechsle ich da jetzt etwas.
Sebastian ja das stimmt was Du da schreibst, dem bin ich auch im Bilde. Ich habe zum anfang den Begriff "Speicherklasse" verwendet, weil das Schlüsselwort static nunmal auch dazu gehört.
-
static_magic schrieb:
drakon: Also meintest du eigentlich nur das eine Globale Variable die wie folgt deklariert wurde:
int i;
eine Statische Lebenszeit hat, aber nicht static ist? Oder verwechsle ich da jetzt etwas.
Ja, genau. Mir war nicht mehr klar, dass static als linkage specifier ebenfalls eine Verwendung hat. Tut mir leid, wenn ich dich da verwirrt habe.

Ich denke, dass das Standardisierungskomitee guten Grund hatte dieses Sprachmittel als "Missbilligt" zu handeln.
-
Hey ist doch kein Problem. Ich wollte hier aber auch niemand angreiffen oder so!

BTW: Falls hier namespace als Alternative gemeint ist, finde ich das auch viel besser. Allerdings muss ich sagen, für wenige Variablen finde ich static besser, um einen Scope zu erzeugen.
Nicht?

-
static_magic schrieb:
Hey ist doch kein Problem. Ich wollte hier aber auch niemand angreiffen oder so!

BTW: Falls hier namespace als Alternative gemeint ist, finde ich das auch viel besser. Allerdings muss ich sagen, für wenige Variablen finde ich static besser, um einen Scope zu erzeugen.
Nicht?

Wie gesagt mir war die ganze Problematik gar nicht bewusst, weil ich das gar nie brauche.. Aber wenn, würde ich troztdem zum namespace tendieren. Einfach, weil es viel verständlicher ist, was man vorhat.
-
static_magic schrieb:
...Globale Variable...
int i;Objekte, die auf Namensraumebene definiert bzw deklariert werden, besitzen immer eine statische Speicherklasse. In Deinem Fall ist es eine Definition mit externer Bindung. Andere Beispiele:
static int j; // Definition, interne Bindung const int k=2; // Definition, interne Bindung extern int l; // Deklaration, externe Bindung extern const int m; // Deklaration, externe Bindung extern const int n=3; // Definition, externe BindungGruß,
SP
-
drakon schrieb:
Wie gesagt mir war die ganze Problematik gar nicht bewusst, weil ich das gar nie brauche.. Aber wenn, würde ich troztdem zum namespace tendieren. Einfach, weil es viel verständlicher ist, was man vorhat.
Wenn ich eine static Variable in einer Datei sehe, macht es *PLING* und ich weiss sofort:
Diese Variable ist nur innerhalb dieser Datei sichtbar.
Damit ist es klar, was man damit vorhat.
MfG,
k.w.k.