Unterschied deklarieren/definieren

schiese

Erfahrenes Mitglied
Hallo,
ich habe in meinem Skript was von Variablendeklaration und Variablendefinition stehen. Nur wird der Unterschied nicht sehr gut beschrieben.
Eine Deklaration legt die Bedeutung eines Bezeichners fest (also Datentyp, Speicherklasse,....), es wird aber kein Speicherplatz reserviert.
Bei der Definition wird zusätzlich noch Speicherplatz reserviert und eine Definition darf nur einmal vorkommen.
Wenn ich jetzt so etwas wie
int a;
habe ist es ja eine Definition (und Deklaration, da jede Definition auch eine Deklaration ist), da ja bereits Speicherplatz reserviert wird.
Wie schaut dann eine reine Deklaration aus?

Edit: das Schlüsselwort extern macht dies.

Gruß schiese
 
Zuletzt bearbeitet:
Eine Deklaration legt fest, dass es diese Variable mit diesem Namen gibt.
Eine Definition legt den Wert bzw. Inhalt der Variablen fest.
C++:
int x; // Deklaration
x = 10; // Definition
Oft kann man auch gleich bei der Deklaration eine Definition angeben, z.B.:
C++:
int x = 10; // Deklaration & Definition
TKlasse *MeinObjekt = new TKlasse(); // auch Deklaration & Definition

Bei einer Deklaration einer (kein Pointer!) Variablen wird automatisch Speicherplatz belegt.
Ist deine Variable aber hingegen ein Pointer, dann wird der Speicherplatz (abgesehen vom Speicher des Pointers selbst) erst nach Nutzung von new belegt:
C++:
int x;  // Deklaration mit Speicherplatzbelegung

int *x; // Deklaration, aber noch keine Speicherplatzbelegung
x = new int; // Jetzt wurde der Speicher angefordert und belegt
 
@ComFreek, da muss ich widersprechen. chiese hat die Bedeutung der Begriffe schon richtig genannt, dass was du als Definition bezeichnet hast, ist in Wahrheit eine Definition + Ininitialisierung (Korrektur: vorher Instanzierung, trifft hier nicht ganz zu).
Eine Deklaration ist wirklich nur, dem Compiler die Bedeutung zu erklären aber noch _keinen_ Speicherplatz reservieren.

Nachlesbar in der Wikipedia oder in der genannten Referenz.

Gruß
Matt
 
Zuletzt bearbeitet:
Ja genau, eine Definition ist sozusagen eine Deklaration + Speicher-Allozierung.
Wie schiese schon herausgefunden hat, funktioniert das in c mit "extern".
Wir hatten mal nen Lehrer, der war bei falscher Verwendung eines der Begriffe übertrieben pingelig, sowas merkt man sich dann ;)
 
Nicht jede Deklaration ohne Definition enthält das Schlüsselwort extern. Eine reine Deklaration kann z.B. auch die Vorwärtsdeklaration einer Funktion sein:
C:
void foo(int, char); // Kein Funktionsrumpf: Vorwärtsdeklaration
In C++ kann man darüber hinaus auch Klassen vorwärtsdeklarieren:
C++:
class foo; // Kein Klassenrumpf: Vorwärtsdeklaration

Grüße,
Matthias
 
Zurück