Definition vs. Deklaration?
-
Moin,
ICh habe eine Frage zu Definition vs. Deklaration.
Also ich habe viel gegooglet, aber man findet nur schwer richtig ausführliche Erklärungen, meistens stehen nur Definitionen da, die für mich viel SPielraum zu intepretation lassen:
Also eine Deklaration führt nur einen Bezeichner formell ein.
Eine Definition ist immer dann, wenn der Compiler Code ereugt, der für die Variable Speicher reserviert. Oder falls es sich um eine Funktion handeln sollte: Wenn die Funktion über einen Rumpf verfügt.1.) Warum ist int c; bereits eine Definition? Wird automatisch Speicher reserviert wenn sowas im Code auftaucht? Wäre dann int *c; eine Definition oder eine Deklaration? Schließlich muss ich da ja selbst den Speicher reservieren!
2.) Gilt: int meineFunktion(){} bereits als Definition? Oder wäre nur int meineFunktion(); eine Deklaration?
3.) struct s; gilt als Deklaration, oder?
4.) extern int i; ist eine Deklaration, weil die eigentliche Speicherzuteilung etc. in einer anderen Übersetzungseinheit stattfindet?
5.) int meineFunktion(int i); Also die "meineFunktion" gilt als Deklaration, aber was ist mit int i ? Wäre das wieder wie in 1.) eine Definition, weil ein Typ angegeben ist?
6.) static deklarierte Variablen sind automatisch Definitionen, oder? Allgemein müssten doch Variablendeklarationen ohne extern immer Definitionen sein, oder? weil man muss doch immer den Typ angeben?
7.) Was wäre mit der Funktion int fun(int); ?
8.) Gelten Konstante genauso wie die "normalen" Variablen? Also wäre extern const int i; auch eine Deklaration ?
Vielen Dank für Antworten!
-
http://www.c-plusplus.net/forum/viewtopic-var-t-is-61231.html <- Stammt zwar aus der C++-FAQ, sollte aber auch auf C zutreffen.
-
-
Das sind genau die Seiten die ich auch schon durchgelesen habe...sorry, aber auf denen werden meine unklarheiten echt nicht behandelt...
-
kthesun schrieb:
1.) Warum ist int c; bereits eine Definition? Wird automatisch Speicher reserviert wenn sowas im Code auftaucht? Wäre dann int *c; eine Definition oder eine Deklaration? Schließlich muss ich da ja selbst den Speicher reservieren!
beides ist definition und deklaration in einem. bei int c; sowie int *c; wird ausserdem speicher reserviert (für's erste sizeof(int) und für's zweite sizeof (int*) bytes).
kthesun schrieb:
2.) Gilt: int meineFunktion(){} bereits als Definition? Oder wäre nur int meineFunktion(); eine Deklaration?
das erste ist ebenfalls beides. die funktion wird definiert und angelegt (==deklaration). das zweite ist nur eine definition.
kthesun schrieb:
3.) struct s; gilt als Deklaration, oder?
auch beides.
kthesun schrieb:
4.) extern int i; ist eine Deklaration, weil die eigentliche Speicherzuteilung etc. in einer anderen Übersetzungseinheit stattfindet?
dazu würde ich definition sagen, weil die variable hier nicht erzeugt wird, sondern sich wo anders befindet.
kthesun schrieb:
5.) int meineFunktion(int i); Also die "meineFunktion" gilt als Deklaration, aber was ist mit int i ? Wäre das wieder wie in 1.) eine Definition, weil ein Typ angegeben ist?
das ist nur 'ne definition (funktionsprototyp).
kthesun schrieb:
6.) static deklarierte Variablen sind automatisch Definitionen, oder?
auch beides in einem. ob 'static' oder nicht, spielt keine rolle.
kthesun schrieb:
7.) Was wäre mit der Funktion int fun(int); ?
funktionsprototyp == definition.
kthesun schrieb:
8.) Gelten Konstante genauso wie die "normalen" Variablen? Also wäre extern const int i; auch eine Deklaration ?
auch beides in einem. das 'const' spielt keine rolle.
btw: ^^die antworten spiegeln meine persönliche ansicht wieder. wahrscheinlich sehen das andere anders.
-
was ist denn so schwer zu verstehen?
Mit der Deklaration oder Funktion stellt man den Compiler eine Funktion vor.
int foo(int bar);
damit weiß der Compiler: es gibt die Funtion foo, welche einen Integer zurückgibt und einen Interger als Parameter bekommt.
Das ist notwendig, damit der Compiler weiß, was er machen soll, wenn ich mit der 'foo' zeichenkette konfrontiert ist
int x = foo(); struct abc l = foo(4); nt z = foo("hello", XXX, WASJSJ); int das_einige_was_korrekt_ist = foo(1);
Ohne Deklaration weiß der Compiler nicht, was dieses 'foo' heißt und dann muss er raten, dabei kann er sehr falsch liegen. Mit der Deklaration wüsste der Compiler, was 'foo' ist und würde bei den ersten 3 Versuchen Compiler Fehler ausgeben.
Die Definition ist dafür da, den Code der Funktion zu implementieren, sprich, was sie tun muss.
Quasi Faustregel:
Deklarationen stets in Header Files (.h)
Definitionen stets in Source Files (.c/*.cpp/etc)
-
kthesun schrieb:
1.) Warum ist int c; bereits eine Definition? Wird automatisch Speicher reserviert wenn sowas im Code auftaucht? Wäre dann int *c; eine Definition oder eine Deklaration? Schließlich muss ich da ja selbst den Speicher reservieren!
2.) Gilt: int meineFunktion(){} bereits als Definition? Oder wäre nur int meineFunktion(); eine Deklaration?
3.) struct s; gilt als Deklaration, oder?
4.) extern int i; ist eine Deklaration, weil die eigentliche Speicherzuteilung etc. in einer anderen Übersetzungseinheit stattfindet?
5.) int meineFunktion(int i); Also die "meineFunktion" gilt als Deklaration, aber was ist mit int i ? Wäre das wieder wie in 1.) eine Definition, weil ein Typ angegeben ist?
6.) static deklarierte Variablen sind automatisch Definitionen, oder? Allgemein müssten doch Variablendeklarationen ohne extern immer Definitionen sein, oder? weil man muss doch immer den Typ angeben?
7.) Was wäre mit der Funktion int fun(int); ?
8.) Gelten Konstante genauso wie die "normalen" Variablen? Also wäre extern const int i; auch eine Deklaration ?
1. Beides ist Definition, weil in beiden Fällen Speicher bereitgestellt wird, einmal für den int, das andere Mal für den Zeiger.
Merke: Grundsätzlich ist eine Definition auch immer eine Deklaration!
2. Ja. Im ersten Fall ist ja der Funktionsrumpf, also die Funktion, definiert, ergo eine Definition. Im zweiten Fall ist das nicht der Fall, ergo Deklaration, die Definition muß irgendwo anders stehen.
3. Ja, keine Reservierung von Speicher. Nur der Datentyp wird bekannt gemacht, und es kann nun zB ein Zeiger auf diesen Typ schon deklariert werden, obwohl die Definition erst später erfolgt.
4. Ja.
5. Nur eine Funktionsdeklaration. int i ist die Deklaration des Funktionsparameters -> keine Bereitstellung von Speicher an dieser Stelle.
6. Ja.
7. Deklaration, wie bei 5. Nur der Name des Funktionsparameters wird hier erst bei der Funktionsdefinition festgelegt.
8. Auch bei extern const int i; wird kein Speicher reserviert --> Deklaration.
-
[quote="~fricky"]
kthesun schrieb:
btw: ^^die antworten spiegeln meine persönliche ansicht wieder. wahrscheinlich sehen das andere anders.
Oh ja
Du verwechselst übrigens die Begriffe Definition und Deklaration.
-
Belli schrieb:
Du verwechselst übrigens die Begriffe Definition und Deklaration.
ehrlich? ok, dann alles vertauschen bitte.