Die Deklaration und Initialisierung von Variablen ist das Grundpfeiler der C-Sprache mit sehr strengen und manchmal nicht offensichtlichen Regeln. Wie und wo Sie eine Variable deklarieren, beeinflusst sogar ihren Ausgangswert (bei der Initialisierung) sowie die Verbindung zum Speicherobjekt (bei Deklaration und Definition).
C geht auf Zeiten zurück, als Speicheroptimierung oberste Priorität hatte. Entwickler mussten Variablen selbst deklarieren und initialisieren, andernfalls wurde das Verhalten des Programms unvorhersehbar. In modernen C-Compilern führt selbst eine kleine Abweichung zu Linkerfehlern oder impliziter Initialisierung mit "Müll".
Häufige Fehler:
Beispielcode:
#include <stdio.h> int global_var; // Definition, automatische Initialisierung = 0 static int static_global_var; // static-Datei, automatische Initialisierung = 0 extern int extern_var; // Deklaration, Definition irgendwo anders void foo() { int local_var; // automatisch, nicht initialisiert -> Müll static int static_local_var; // static, automatisch initialisiert auf 0 }
Wichtige Merkmale:
1. Werden automatische Variablen (lokale ohne static und extern) vom Compiler automatisch auf 0 initialisiert?
Nein, sie enthalten Müll. Ihr Wert ist nicht definiert, die Verwendung vor der Initialisierung ist ein Fehler.
2. Kann man eine Variable mit extern in verschiedenen Dateien mehrfach definieren?
Nein, es muss eine Definition geben, die anderen sind Deklarationen durch extern, sonst gibt der Linker einen "multiple definition"- oder "undefined symbol"-Fehler aus.
3. Was ist der Unterschied zwischen der Deklaration und der Definition einer Funktion?
Die Deklaration ist nur ein Prototyp (ohne Körper); die Definition enthält unbedingt den Körper der Funktion. Für Variablen reserviert die Deklaration durch extern keinen Speicher, für Funktionen sind beide Formen erlaubt.
Eine globale Variable int counter; wird in zwei Header-Dateien deklariert. Das Projekt wurde mit dem Fehler "multiple definition" gelinkt.
Vorteile:
Nachteile:
In der Header-Datei wird extern int counter; angegeben, die Definition int counter = 0; — nur in einer C-Datei.
Vorteile:
Nachteile: