Warum nicht immer gleich static!?



  • 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 static ist ü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 static durcheinandergeworfen.



  • Badestrand schrieb:

    Wahrscheinlich meinte drakon genau das (also auto-Speicherklasse), hat aber kurz die semantischen Unterschiede von static durcheinandergeworfen.

    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 static als 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 Bindung
    

    Gruß,
    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.


Anmelden zum Antworten