Was genau ist deklarieren und definieren?

5 Antworten

Da du das Schlüsselwort "extern" verwendest, gehe ich davon aus, dass du C oder C++ als Programmiersprache verwendest.

Bei der Deklaration wird dem Compiler gesagt, dass es irgendwo im Programm eine bestimmte Variable oder eine bestimmte Funktion gibt (das wurde bereits in anderen Antworten geschrieben).

Bei der Definition wird diese Variable oder Funktion tatsächlich angelegt.

Wichtig: Bei einer Definition wird einer Variable noch nicht unbedingt (wie man aus den anderen Antworten falsch schließen könnte) ein Wert zugewiesen!

Ein Beispiel: Ein Programm besteht aus den Dateien "a.c" und "b.c":

Datei "a.c"
-----------
extern int a; // Deklaration
int b=10; // Definition mit Wertzuweisung
int c; // Definition ohne Wertzuweisung (!!)
int d=10; // Definition mit Wertzuweisung
int e=10; // Definition mit Wertzuweisung
...
a=1;
b=2+c;
Datei "b.c"
-----------
extern int a; // Deklaration
int b; // Definition ohne Wertzuweisung (!!)
extern int c; // Deklaration
int e=10; // Definition mit Wertzuweisung
...
a=d+4;

Es gilt nun folgendes:

  • Die Datei "b.c" wird sich nicht compilieren lassen. Der Grund: Bei der Zeile "a=d+4" weiß der Compilier nicht, was "d" ist, da die Deklaration von "d" fehlt. Prinzipiell "schaut" ein C- oder C++-Compiler nur diejenige Datei an, die er gerade compiliert. Er "weiß" also nicht, dass in der Datei "a.c" eine Variable "d" existiert. Dazu wäre eine Deklaration von "d" in der Datei "b.c" notwendig.
  • Wenn wir die Deklaration der Variable "d" in der Datei "b.c" hinzugefügt haben, wird das Programm durchcompilieren, aber nicht linken. Das bedeutet, dass der binäre Code (die so genannten "Objektdateien"), der aus den beiden Dateien "a.c" und "b.c" erstellt worden ist, sich nicht zu einem ausführbaren Programm (z.B. "test.exe") zusammenfügen lässt. Und zwar aus drei Gründen:
  • Von der Variable "a" existieren zwar Deklarationen, aber keine Definition. Dadurch existiert die Variable "a" im binären Code nicht. Man bekommt eine Fehlermeldung, dass die Variable "a" im binären Code nicht existiert.
  • Von der Variable "e" existieren zwei Definitionen mit Wertzuweisung. In diesem Fall ist es prinzipiell nicht möglich, die binären Codes zu einem Programm zusammenzusetzen, selbst wenn beide Wertzuweisungen den selben Wert (im Beispiel: 10) hatten. Man bekommt eine Fehlermeldung.
  • Manche Compiler ersetzen eine Definition ohne Wertzuweisung durch eine Definition mit einem Dummy-Wert ("int b;" -> "int b=0;"). In diesem Fall gilt für "b" dasselbe wie für "e". Aber auch bei Compiliern, die das nicht tun, bekommt man sehr oft eine Fehlermeldung, weil eine Variable mehrfach definiert ist und es wird keine ".exe"-Datei erstellt.

Bei der Deklaration wird z.B. die Variable nur namentlich genannt, also der Compiler weiß dann: Es gibt eine Variable, die XY heißt. Bei der Definition wird der Variable dann ein Wert zugewiesen XY=12

AHSO  vielen dank :D

Das ist falsch. Bei der Definition wird nichts zugewiesen. Das ist die Initialisierung.

Rein sprachlich bedeutet definieren soviel wie festlegen, bestimmen. Deklarieren bedeutet bekannt machen, bekannt geben (z.B. beim Zoll, da gebe ich an, welche zu verzollende Ware ich im Koffer habe).

Definition:
Was für ein yp -> int, double, etc.

Deklaration:
Variablenname -> variable1, etc

Initialisierung:
Wert Zuweisung -> = 3, etc.

Bsp:
int diesIstEinTest = 4
| | |
Definition | ____/
Deklaration /
Initialisierung

also ich wär bis dahin verwirrt. alles ein bisschen richtig und falsch.

also: definition:
int xyz;

damit wird xyz ein speicherplatz zugewiesen und xyz = 77; ist eine sinnvolle zuweisung. in den C-sprachen ist auch eine definition mit mit gleichzeitiger initialisierung möglich: int xyz = 77;

wenn das gesamte programm aus mehreren modulen (quelltexten) besteht, mag es manchmal sinnvoll sein auf eine variable zuzugreifen, die in einem anderen modul definiert ist.
im vertrauen darauf, dass dies so ist, wird dies dem compiler  mit dem extern-attribut mitgeteilt = deklariert:

extern int xyz;

falls diese variable nirgends definiert ist, so fällt es dem compiler nicht weiter auf. aber dem linker, der die verschiedenen module zusammenbindet (linked) schon.

Was möchtest Du wissen?