Globale Variable in C
-
SaHel schrieb:
Aber so etwas ist ja schrecklich... historisch? konzeptionell?? oder gibt es da einen besonderen Grund? Was für Vorteile hat das?
Ich meine diese Aussage:
...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.
Zum Beispiel zwei Dateien:
#include <stdio.h> /* Definition des Zeigers mit Ziel */ char *global = "global"; /* Definition der Funktion */ void function(void) { puts(global); }
#include <stdio.h> /* Deklaration des Zeigers */ extern char *global; /* Deklaration der Funktion, 'extern' kann man weglassen */ extern void function(void); /* Definition von main() */ int main(void) { puts(global); global = "changed"; function(); return 0; }
-
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 Dateiglobal
entweder initialisieren (das ergibt hier einen Fehler beim Linken, wegen der Mehrfach-Definition) oder dasextern
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 ...