Globale Variable in C



  • mngbd schrieb:

    Manchmal teilt man die Typ-Vereinbarungen auf in Definitionen, die Speicherplatz bereitstellen, und Deklarationen, die nur den Typ eines Namens vereinbaren. In diesem Sinn ist die Aussage falsch, weil mehrere gleichzeitig sichtbare Definitionen des gleichen Namens ein Fehler sind. Aber viele Deklarationen, z.B. von Funktionen, erkennt der Compiler auch ohne das 'extern', und wenn er die Definition nicht im betreffenden Modul findet, muss sie eben woanders sein. In solchen Fällen darf man das 'extern' weglassen.

    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.

    In der von mir eingangs beschriebenen "EDV Welt" gibt es so etwas so explizit nicht. Dort werden zwischen verschiedenen Modulen lediglich Anfangsadressen übergeben - und zwar vom Caller (ähnlich eines Funktionsaufrufs in C innerhalb eines Moduls). Damit der Called mit dieser Adresse etwas anfangen kann arbeitet man dort mit sogenannten "Copybooks". Das sieht dann stark vereinfacht etwa so aus:

    Prog1
    [...]
    copy "kdstamm".
    (Felder von kdstamm werden beim Compile hier eingefügt)
      kdnr int
      kdname char[xx] (aber anderer Syntax als in C)
    [...]
    Und im Code dann:
    CALL "PROG2" USING kdstamm. (Adresse von kdstamm wird übergeben)
    [...]
    

    In Prog2 wird dann dem Compiler gesagt, dass es sich nicht um eigenen Storage handelt:

    Prog2
    [...]
    Spezieller Linkbereich
    copy "kdstamm".
    (Felder von kdstamm werden beim Compile hier ebenfalls eingefügt)
      kdnr int
      kdname char[xx]
    [...]
    
    Un beim Start (Code) wird dem Compiler dann via USING kdstamm mitgeteilt, 
    dass bei diesem kdstamm die übergebene Adresse vom Caller stammt (*kdstamm aus
     Prog1). Die Namensgebung ist dabei egal (analog C).
    
    [...]
    Macht irgendwas mit kdnr, kdname....
    [...]
    

    Mit dieser Technik verwaltet immer der Caller den gemeinsamen Speicher für den Called. Und die ganze Sache ist transparent.
    Nun ja - andere Welten andere Sitten 😉
    Besten Dank für eure Antworten, die Frage ist damit beantwortet....



  • 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