001
28.05.2007, 07:37 Uhr
virtual
Sexiest Bit alive (Operator)
|
Fangen wir mal mit dem extern an.
In C/C++ unterscheidet man zwischen Deklaration und Definition.
Eine Deklaration führt einen Namen ein und beschreibt, welche Signatur er hat. Zum Beispiel, ist folgendes eine Funktionsdeklaration:
Wenn ein Kompiler eine solche Zeile liest, weiß er, daß der Name "f" eine Funktion ist, welche nix zurückgibt, aber einen int erwartet. Was "f" genau tut, weiß der Kompiler aber noch nicht.
Während eine Deklaration einen Funktionsnamen einführt, ist eine Definition dafür verantwortlich, daß sie beschreibt, was die Funktion tut. Dies hier wäre ein Funktionsdefinition:
C++: |
void f(int a) { sleep(a*a); }
|
Man kann sagen, daß eine Definition stets eine Deklaration ist, nicht jedoch umgekehrt. AUsserdem kann man - auch wenn das anhand von Funktionen nur recht subtil erkennbar ist - feststellen, daß eine Definition stets Speicher (im Programm) verbraucht, eine Deklaration dagegen nicht: Der Maschinencode vom Funktionskörper von "!f" braucht ja irgendwo Platz im Ausführbaren Programm.
Bisher haben wir ja nur über Funktionen geredet und ausserderm gelernt, daß eine Definition stets auch eine Deklaration ist. Wie vermutlich bekannt ist, ist eine Variablen Definition so was hier:
Bedeutet: es gibt einen Speichplatz welcher soviel Platz hat, daß ein int reinpasst und er wird a genannt. (Um es deutlich zu machen: Die Definition belegt also Speicher). Will man nun deutlich machen, daß es ein "a" gibt, aber es nicht definieren, so muß man es deklarieren. Während man bei Funktionen eine Deklaration von eine Definition leicht dadurch unterscheiden kann, daß bei einer Deklaration der Funktionskörper fortgelassen wird, sieht es bei Variablen so aus, daß wenn da "extern" steht, die dies nur eine Deklaration ist ("extern" heißt also: Die Variable ist irgendwo anders definitiiert).
Generell darf man ein Ding deklararieren so oft man lustig ist (solange sich dir Deklarationen nicht widersprechen). Dagegen gibt es in C eine eiserne "One-Definition-Rule" die Besagt, daß man zu einem Namen nur eine Definition finden darf.
Die Header sollen in C/C++ generell nur Deklaration enthalten. Dies liegt daran, daß Header in verscheidenen Dateien eines Projekts mehrmals inkludiert werden können. Da das Includieren letztlich nichts anderes bedeutet, daß die Includeanweisung verbatim mit dem Headerfile inhalt ersetzt wird, würde eine Definition in einer Includedatei dazu führen, daß es mehrere Konkurrierende Definition eines Namens geben würde.
Für dein Vorhaben ist ein Singleton sicherlich ein korrekter Ansatz. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |