Globale Variable in C



  • SaHel schrieb:

    Wenn ich das jetzt richtig verstanden habe, besteht bei diesen globalen Variablen die Gefahr, dass sie vom Compiler als extern interpretiert werden können - etwa bei Namensgleichheit und fehlender Dekleration in einem anderen Modul.

    Die Gefahr besteht, Beispieldateien:

    char *global = "one";
    char *function(void) { return global; }
    
    #include <stdio.h>
    
    extern char *function(void);
    char *global;
    
    int main(void)
    {
        global = "two";
        puts(global);
        puts(function());
        return 0;
    }
    

    global ist hier eine über beide Dateien ("compilation units") globale Variable. Man könnte erwarten, dass die beiden Variablen verschieden sind, weil es so aussieht, als würde in beiden Dateien Speicher für sie bereitgestellt; aber eben das ist nicht der Fall. Wenn man dabei ein Missverständnis befürchtet, sollte man in der zweiten Datei global entweder initialisieren (das ergibt hier einen Fehler beim Linken, wegen der Mehrfach-Definition) oder das extern dazuschreiben (dann ist klar, dass es nicht als Definition verstanden werden soll).

    Das erklärt teilweise, warum erfahrene C-Leute dazu tendieren, alle Variablen zu initialisieren. Es empfiehlt sich in diesem Sinn auch, das extern niemals wegzulassen.

    Falls aber zwei verschiedene, nur über die jeweilige Datei globale Variablen erwünscht sind, muss man sie, wie gesagt, static machen. Weil das der Regelfall ist, kann man sagen, dass es ein Fehler von C ist, globale Variablen per default global über alle Dateien zu machen.

    Warum ist das so? Ich kann mir vorstellen, dass es daran liegt, dass C als möglichst einfache Sprache gedacht ist, und man auf diese Weise solche Fragen des Linkens weitgehend aus der Syntax heraushalten kann, was den Compiler einfach und portabel hält.
    🙂



  • mngbd, wieso machst Du unter fast jeden Beitrag einen Smiley? 😕



  • Um frickys Andenken zu wahren? 😃



  • _matze schrieb:

    Um frickys Andenken zu wahren?

    Wer ist das?



  • Fragensteller2 schrieb:

    mngbd, wieso machst Du unter fast jeden Beitrag einen Smiley? 😕

    Schade...
    Ich bin gerade ein wenig am Testen, um das Linkverhalten von diesen glob. Variablen besser beurteilen zu können. Habe aber wenig Zeit. Wer weiss, vielleicht hilft dem einen oder anderen C Umsteiger ein solcher Thread. 😉

    Ach ja, das war gerade auch ein Smiley

    SaHel



  • SaHel schrieb:

    Habe aber wenig Zeit. Wer weiss, vielleicht hilft dem einen oder anderen C Umsteiger ein solcher Thread.

    Du musst ja nicht alles lesen, wir würden auch ganz ohne Publikum über C philosophieren.

    Fragensteller2 schrieb:

    mngbd, wieso machst Du unter fast jeden Beitrag einen Smiley? 😕

    Weil ich ihn manchmal vergesse.

    _matze schrieb:

    Um frickys Andenken zu wahren? 😃

    Wer ist denn das? Ich hab das von dem/der übernommen:
    http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-106530.html
    🙂



  • (versehentlich zweimal gepostet)



  • mngbd schrieb:

    http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-106530.html
    🙂

    😮 was?? 935361 Beiträge und das seit 20.09.2007? 54% aller Beitrage stammen von ihm/ihr? Ist das nicht ein DB Fehler?



  • supertux schrieb:

    😮 was?? 935361 Beiträge und das seit 20.09.2007? 54% aller Beitrage stammen von ihm/ihr? Ist das nicht ein DB Fehler?

    Admin fragen. Oder gut suchen.
    🙂



  • mngbd schrieb:

    Wer ist denn das? Ich hab das von dem/der übernommen:

    you never walk alone ...
    🙂


Anmelden zum Antworten