====== Sichtbarkeit von Variablen ====== Im Kapitel [[def|Definition von Variablen]] haben wir uns angesehen, wie man Variablen definiert. Hier werden wir uns ansehen, wo man Variablen überall definieren kann. In C Programmen gibt es da zwei Unterscheidungen, die Einfluss auf die Sichtbarkeit von Variablen nehmen. Globale Variablen sind im ganzen Quelltext zu sehen und können auch anderen Quelltexten zur Verfügung gestellt werden. Lokale Variablen sind Variablen, die nur innerhalb eines Anweisungsblocks sichtbar sind, also am Ende eines Blocks aufhören zu existieren. ===== Globale Variablen ===== Wie gesagt sind globale Variablen global sichtbar. Das bedeutet, dass sie von allen Funktionen heraus angesprichen werden können: #include #include int global = 4; void func( void ) { global = global + 10; printf( "func: Wert der globalen Variable: %d\n", global ); } int main( void ) { printf( "main: Wert der globalen Variable: %d\n", global ); func(); printf( "main: Wert der globalen Variable: %d\n", global ); return EXIT_SUCCESS; } ==== Vorteile ==== Werte, die in globalen Variablen stehen, müssen also nicht beim Aufruf einer Funktion übergeben werden, was den Funktionsaufruf beschleunigt und auch der Zugriff auf die Variable ist schneller. ==== Fehlerquellen ==== Dennoch sind globale Variablen heutzutage ungern gesehen: Da sie von jeder Stelle im Programm verändert werden dürfen und viele Programmierer sie für die unterschiedlichsten Dinge benutzen, zeigt die Erfahrung, dass Programme, die viel mit globalen Variablen arbeiten, häufig merkwürdige und schwer nachvollziehbare Fehler produzieren. Als Negativbeispiel wäre eine globale Variable i genannt, die in einer Schleifen hochgezählt wird. Wird innerhalb dieser Schleife nun eine Funktion gerufen, die ebenfalls das globale i als Schleifenvariable verwendet, kommen sich beide Schleifen in die Quere: #include #include /* * Fehlerquelle: globale Variable, die mehrfach gleichzeitig und unabhängig voneinander verwendet wird */ int i = 4; void writeLine( void ) { /* Schreibe die Zahlen von 9 bis 1. */ i = 9; while( i-- ) printf( "%d", i ); } int main( void ) { i = 5; /* Schreibe fünf Zeilen */ while( i-- ) { writeLine(); printf( "\n" ); } return EXIT_SUCCESS; } Es wird lediglich eine Zeile geschrieben, da writeLine() die globale Variable verändert, die auch in main() verwendet wird. ==== Verwendung ==== Globale Variablen sollten daher wirklich ausschließlich dann eingesetzt werden, wenn ihr Verwendungszweck eindeutig ist. So lässt sich die globale Konfiguration einer Software, die nur Werte enthält, die alle Teile der Software gelegentlich abfragen, vertretbar als globale Variable verwenden. Da die Konfiguration nicht mit jedem Funktionsaufruf weitergegeben werden muss, werden die [[glossary:signature|Signaturen der Funktionen]] so übersichtlicher und der Aufruf von Funktionen schneller. ===== Lokale Variablen ===== Lokale Variablen sind nur innerhalb eines Anweisungsblock gültig. Wird das Ende des Anweisungsblocks erreicht, in dem sie definiert wurden, so geht auch die Variable verloren: #include #include void func( int parameter ) { parameter = paramater + 10; printf( "func: Wert der Variablen: %d\n", parameter ); } // hier geht parameter verloren int main( void ) { int local = 4; printf( "main: Wert der lokalen Variable: %d\n", local ); func( local ); // lokal wird als Parameter kopiert printf( "main: Wert der lokalen Variable: %d\n", local ); return EXIT_SUCCESS; } // hier geht local verloren Möchte man eine lokale Variable in einer anderen Funktion verwenden, so muss man sie als Parameter übergeben.