Globale Variablen Diverses Globale Variablen Globale Variablen Globale Variablen Diverses Wdh: Variablen in Funktionen Globale Variablen lokale Variablen Variablen bisher nur am Anfang von Funktionen auch erlaubt: am Anfang innerer Codeblöcke (innerhalb geschweifter Klammern) in C99 und als gcc-Erweiterung: an beliebiger Stelle innerhalb einer Funktion Globale Variablen Globale Variablen Diverses Wdh: Variablen in Funktionen Globale Variablen Sichtbarkeit und Lebensdauer von lokalen Variablen lokale Variablen können benutzt werden von Punkt ihrer Deklaration an bis zum Ende des Blocks, in dem sie deklariert wurden lokale Variablen existieren, bis der Block, in dem sie deklariert wurden, verlassen wird im Falle eines rekursiven Funktionsaufrufes existieren sie mehrmals, nur die aktuell gültigen können verändert werden Globale Variablen Globale Variablen Diverses Wdh: Variablen in Funktionen Globale Variablen so nicht! int *somevector( void ) { int v[10]; /* irgendwas mit v */ return v; /* falsch! */ } Nach dem Verlassen der Funktion ist der für v angelegte Speicher wieder freigegeben und wird anderweitig benutzt. Hier muss malloc o.ä. verwendet werden. Globale Variablen Globale Variablen Diverses Wdh: Variablen in Funktionen Globale Variablen Globale Variablen Variablen können auch außerhalb von Funktionen (deshalb auch: externe Variablen) deklariert werden. Für diese gilt: Sie sind global sichtbar (in jeder Funktion sichtbar, sofern dort nicht eine Variable mit demselben Namen deklariert wird, wodurch die globale Variable überdeckt wird) Sie existieren während des gesamten Programmablaufes genau einmal falls keine andere Definition stattfindet, erhalten sie den Anfangswert Null Globale Variablen Globale Variablen Diverses Wdh: Variablen in Funktionen Globale Variablen Gegenüberstellung /* lokal */ void inc(int *c) { (*c)++; } int main( void ) { int a=0; ... inc(&a); ... } /* global */ int a; void inc(void) { a++; } int main(void) { ... inc(); ... } Globale Variablen Globale Variablen Diverses Wdh: Variablen in Funktionen Globale Variablen Gegenüberstellung /* lokal */ void inc(int *c) { (*c)++; } int main( void ) { int a=0; ... inc(&a); ... } /* global */ int a; void inc(void) { a++; } int main(void) { ... inc(); ... } Globale Variablen Globale Variablen Diverses Wdh: Variablen in Funktionen Globale Variablen Globale Sichtbarkeit - Segen und Fluch , Globale Variablen vereinfachen Funktionsaufrufe, da sie dort nicht mit angegeben werden müssen. / Andrerseits wird der Datenfluss verdeckt, da man dem Funktionsaufruf nicht mehr ansieht, dass ein Wert verändert werden kann. / Zudem sind Funktionen, die mit globalen Variablen arbeiten, weniger flexibel. Globale Variablen sollten sparsam eingesetzt werden. Sinnvoll sind sie vor allem für Daten, mit denen das ganze Programm arbeiten muss. Globale Variablen Globale Variablen Diverses Wdh: Variablen in Funktionen Globale Variablen Statische Variablen Einen Kompromiss stellen statische Variablen dar. Sie werden innerhalb einer Funktion mit dem Schlüsselwort static definiert. Ihre Sichtbarkeit ist wie die von lokalen Variablen, ihre Lebensdauer und Initialisierung wie die von globalen Variablen. Eine Funktion, die zurückgibt, wie oft sie aufgerufen wurde: /* global */ /* statisch */ int counter; int count( void ) { static int counter; return ++counter; } int count( void ) { return ++counter; } Globale Variablen Globale Variablen Diverses Wdh: Variablen in Funktionen Globale Variablen Statische Variablen Einen Kompromiss stellen statische Variablen dar. Sie werden innerhalb einer Funktion mit dem Schlüsselwort static definiert. Ihre Sichtbarkeit ist wie die von lokalen Variablen, ihre Lebensdauer und Initialisierung wie die von globalen Variablen. Eine Funktion, die zurückgibt, wie oft sie aufgerufen wurde: /* global */ /* statisch */ int counter; int count( void ) { static int counter; return ++counter; } int count( void ) { return ++counter; } Globale Variablen Globale Variablen Diverses Wdh: Variablen in Funktionen Globale Variablen Statische Variablen Einen Kompromiss stellen statische Variablen dar. Sie werden innerhalb einer Funktion mit dem Schlüsselwort static definiert. Ihre Sichtbarkeit ist wie die von lokalen Variablen, ihre Lebensdauer und Initialisierung wie die von globalen Variablen. Eine Funktion, die zurückgibt, wie oft sie aufgerufen wurde: /* global */ /* statisch */ int counter; int count( void ) { static int counter; return ++counter; } int count( void ) { return ++counter; } Globale Variablen Globale Variablen Diverses Makros als Konstanten Leere Anweisung Konstanten Anstatt eine Zahl mehrere Male im Programm stehen zu haben, ist es sinnvoller, dafür einmal eine Konstante zu definieren. Eine Möglichkeit dafür sind Makros. #define SIZE 10 int a[10]; ... for(i=0; i<10; i++) ... int a[SIZE]; ... for(i=0; i<SIZE; i++) ... Globale Variablen Globale Variablen Diverses Makros als Konstanten Leere Anweisung Konstanten Anstatt eine Zahl mehrere Male im Programm stehen zu haben, ist es sinnvoller, dafür einmal eine Konstante zu definieren. Eine Möglichkeit dafür sind Makros. #define SIZE 10 int a[10]; ... for(i=0; i<10; i++) ... int a[SIZE]; ... for(i=0; i<SIZE; i++) ... Globale Variablen Globale Variablen Diverses Makros als Konstanten Leere Anweisung Hinweise zu Makros für Konstanten Syntax: #define <Name> <Wert> Konvention: Name in Großbuchstaben Kein Semikolon am Ende auch sinnvoll, wenn die Konstante nur einmal im Programm auftaucht (Auch EOF und NULL sind als Makros definiert.) Globale Variablen Globale Variablen Diverses Makros als Konstanten Leere Anweisung Leere Anweisung Gelegentlich braucht man, um den Syntaxregeln von C zu entsprechen, eine Anweisung, wo man gar nichts machen will. Dann kann man die leere Anweisung benutzen. Sie besteht einfach nur aus einem Semikolon. Es wird meist in einer eigenen Zeile geschrieben. while (s[len] != ’\0’) len++; while (s[len++] != ’\0’) ; Globale Variablen Globale Variablen Diverses Makros als Konstanten Leere Anweisung Leere Anweisung Gelegentlich braucht man, um den Syntaxregeln von C zu entsprechen, eine Anweisung, wo man gar nichts machen will. Dann kann man die leere Anweisung benutzen. Sie besteht einfach nur aus einem Semikolon. Es wird meist in einer eigenen Zeile geschrieben. while (s[len] != ’\0’) len++; while (s[len++] != ’\0’) ; Globale Variablen