Sam schrieb:
> Hey,
>
> danke für die Antworten:
>
> @Klaus,
> ok nur damit sicher bin das ich das richtig verstanden habe:
>
> --> ohne "extern" wird die lokale Variable konto beim Aufruf einer
> Funktion in konto.c angelegt und am Ende wieder freigegeben; wie geht
> das konkret jetzt beim linken mit "extern", wird die gleiche Funktion
> aufgerufen oder wird die auch in anderem Prozesskontext aufgerufen und
> die Variable als "global" deklariert ?
Ohne extern, also mit einem "int konto;" außerhalb aller Funktionen
wird eine globale Variable angelegt (das ist die Definition einer
Variablen).
Mit extern dagegen wird nur gesagt, daß sie in irgendeiner
Übersetzungseinheit (also in irgendeinem der kompilierten
C-Quelltexte) zu finden, aber nicht unbedingt in diesem.
Das ist also die Deklaration einer Variablen.
Stünde in der Headerdatei die Definition ohne extern, dann würde
in jeder Übersetzungseinheit eine globale Variable angelegt werden
(vom Compiler) und der Linker müsste sich dann aufregen, weil
es mehrere globale Objekte mit demselben Namen gibt.
Deshalb steht es mit extern in der .h und ohne in einer .c.
Ähnlich ist es mit Funktionen:
1 | int fkt( int i ); // Deklaration, kann beliebig oft auftauchen
|
2 | // geeignet für Headerdateien
|
3 |
|
4 | int fkt( int i ) // Definition, darf nur einmal vorkommen
|
5 | { // also in genau einer *.c einmal
|
6 | // ...
|
7 | }
|
>
> "Das erspart in größeren Programmen viel Ärger" warum ? Ich mag die
> globalen Variablen bei main halt einfach nicht - daher habe ich
> gedacht, dass ich dadurch Übersichtlichkeit gewinne...
>
> ...
Ist ja auch richtig; dann brauchst du aber eben kein extern.
Mach einfach alle Zugriffe über Funktionen in deiner konto.c
(dort die Definitionen aller nötigen Funktionen und die Definition
einer globalen Variablen).
Die Deklarationen der Funktionen und ggf. der extern-Variablen
kommen in die konto.h.
Wenn du die globale Variable nicht brauchst (was ich empfehle),
dann lass in der konto.h die Deklaration der Variablen weg.
Zudem empfiehlt es sich dann, vor die Definition noch ein
static zu schreiben, dann kann auch niemand mehr von einem anderen
Quelltext aus darauf direkt zugreifen (ohne die Funktionen),
weil die Variable dann nur noch in konto.c sichtbar ist.
-> C-Grundlagen