Hi,
ich Programmiere jetzt seit über 4 Monaten C++ (aus dem Buch) und habe seit ca. 4 Monaten Unterricht in C.
Obwohl ich (wie ich meine ) doch schon relativ viel gelernt habe schleppe ich eine große Frage ständig mit mir herum und die jetzt, da ich meine immer größeren Projekte brav in .h und .ccp Datein aufteile sehr wichtig ist.
Was ist der Unterschied zwischen definieren, deklarieren und initialisieren.
In der Schule heißt es immer wir müssen ... Variablen deklarieren.
Wenn ich das in meinem Buch aber richtig verstanden habe (...) dann müsste das so sein:
C/C++ Code:
static int var=1;
//static = Deklaration,
//int var = Definition,
//var=1 = Initialisierung
C/C++ Code:
static int var=1;
//static = Deklaration,
//int var = Definition,
//var=1 = Initialisierung
C/C++ Code:
static int var=1;
//static = Deklaration,
//int var = Definition,
//var=1 = Initialisierung
Und wie nennt man das auch bei Funktionen?
Und mir ist etwas aufgefallen:
Ich dachte wenn ich eine Variable außerhalb aller Funktion (auch main) deklariere/definiere würde diese Programmglobal sein. Dem ist aber nicht so. Ich kann diese nur mit Hilfe der Speicherklasse extern in eine andere .cpp datei verwenden, warum?
_________________ Gruß
FUNPAQ
Zuletzt bearbeitet von HumeSikkins am 13:03:41 13.01.2004, insgesamt 1-mal bearbeitet
Deklaration heisst:
Dem Compiler sagen, dass es etwas gibt. zB ist
C/C++ Code:
void foo();
C/C++ Code:
void foo();
C/C++ Code:
void foo();
eine Deklaration. Du sagst damit dem Compiler, dass es eine Funktion foo gibt, die void returned und keine Parameter nimmt.
Definition heisst:
Dem Compiler sagen, dass er dieses etwas anlegen soll. zB ist
C/C++ Code:
void foo() { }
C/C++ Code:
void foo() { }
C/C++ Code:
void foo() { }
eine Definition. Du sagst damit dem Compiler, dass die (bereits bekannte Funktion foo - denn jede Definition impliziert eine Deklaration) exakt so aussieht.
Initialisierung heisst:
Dem Compiler sagen, dass er dieses etwas mit einem bestimmten Wert anlegen soll. zB ist
C/C++ Code:
int i=5;
C/C++ Code:
int i=5;
C/C++ Code:
int i=5;
eine Initialisierung. Du sagst damit dem Compiler, dass die (bereits bekannte Variable i - denn jede Initialisierung impliziert eine Definition, welche ja eine Deklaration impliziert) mit dem Wert 5 vorbegelegt werden soll.
Um Variablen zu deklarieren braucht man das Schlüsselwort 'extern'.
So ist zB
C/C++ Code:
extern int i;
C/C++ Code:
extern int i;
C/C++ Code:
extern int i;
eine Deklaration.
Aber Achtung:
C/C++ Code:
extern int i=5;
C/C++ Code:
extern int i=5;
C/C++ Code:
extern int i=5;
ist eine Initialisierung. Das extern wird (wenn man so will) ignoriert.
Eine Variable die als 'extern' deklariert ist, muss natürlich auch irgendwo definiert werden. Dies geschieht meistens in einer anderen Übersetzungseinheit. Es ist das selbe Prinzip wie bei Funktionen.
C/C++ Code:
class Test {};
C/C++ Code:
class Test {};
C/C++ Code:
class Test {};
ist übrigens auch eine Definition. Die passende Deklaration dazu wäre
_________________ Mein C++ Tutorial - ewig nicht mehr aktualisiert A language that doesn't affect the way you think about programming is not worth knowing.
Zuletzt bearbeitet von HumeSikkins am 13:07:29 13.01.2004, insgesamt 2-mal bearbeitet
Als Ergänzung zu den Beispielen, hier noch eine kurze Definition der drei Begriffe:
Deklaration:
Ein Programmausdruck der einen Namen in einen Scope ein- bzw. wiedereinführt.
Definition:
Eine Deklaration die die Details einer Entität bekannt macht oder, im Fall von Variablen, die dazu führt, dass Speicher für die Entität reserviert wird.
Eine Deklaration einer Klasse (struct, class, enum, union) Funktion oder Methode wird zu einer Definition, wenn auf die Deklaration ein in geschweiften Klammern eingeschlossener Block folgt.
Variablendeklarationen sind immer auch Definitionen es sei denn, der Deklaration ist ein extern vorangestellt.
Initialisierung:
Eine Definition mit expliziter Anfangswertzuweisung.
_________________ Remember Sturgeon's Law:
"Ninety percent of everything is crap." and now go visit my Homepage ;-)
Zuletzt bearbeitet von HumeSikkins am 13:08:31 13.01.2004, insgesamt 1-mal bearbeitet
class foo { // <-- Definition von foo public:
int x; // <-- Definition von foo::x static int y; // <-- Deklaration von foo::y void blah(); // <-- Deklaration von foo::blah int get() const { // <-- Definition von foo::get als inline-Funktion return x;
}
};
int foo::y; // <-- Definition von foo::y
void bar(foo & f); // <-- Deklaration von bar
void bar(foo & f) { // <-- Definition von bar
f.x = 99;
}
class foo { // <-- Definition von foo public:
int x; // <-- Definition von foo::x static int y; // <-- Deklaration von foo::y void blah(); // <-- Deklaration von foo::blah int get() const { // <-- Definition von foo::get als inline-Funktion return x;
}
};
int foo::y; // <-- Definition von foo::y
void bar(foo & f); // <-- Deklaration von bar
void bar(foo & f) { // <-- Definition von bar
f.x = 99;
}
class foo { // <-- Definition von foo public:
int x; // <-- Definition von foo::x static int y; // <-- Deklaration von foo::y void blah(); // <-- Deklaration von foo::blah int get() const { // <-- Definition von foo::get als inline-Funktion return x;
}
};
int foo::y; // <-- Definition von foo::y
void bar(foo & f); // <-- Deklaration von bar
void bar(foo & f) { // <-- Definition von bar
f.x = 99;
}
extern int yay; // <-- Deklaration von yay
int yay; // <-- Definition von yay
extern const int t; // <-- Deklaration von t
extern const int t=2; // < Definition von t
Es gibt aber auch umgangssprachliche Variationen. ZB spricht man bei einer Klassendefinition oft von einer Klassendeklaration. Das hat wahrscheinlich auch mit dem Sprachvorgänger C zu tun, der mit den Begriffen laxer umgeht. Der C Standard verwendet die Begriffe "Deklaration" und "Definition" fast synonym (zumindest im Bezug auf Structs) und spricht lieber von "Funktions-Prototypen" als von "Funktions-Deklarationen".
Eine Definition ist gleichzeitig auch Deklaration. D.H. Du musst nicht alles vorher deklarieren.
Innerhalb einer Übersetzungseinheit (ÜE) sind keine Mehrfachdefinitionen erlaubt. Und für "normale" Funktionen und globale Variablen darf es auch Programm-weit nur eine einzige Definition geben. Eine Klassendefinition in einer Header-Datei, die per Textersetzung in mehreren Übersetzungseinheiten eingebunden wird, ist also okay, obwohl es dann mehr als eine Definition geben wird. Neben "normalen" Funktionen gibt es auch Funktions-Templates und Inline-Funktionen, für die es besondere Regeln gibt. Beispielsweise muss eine Inline-Funktion immer in einer ÜE definiert sein, wenn sie da auch benutzt wird. Typischerweise packt man Inline-Funktionen und Funktions-Templates auch in Header-Dateien rein, wenn man sie in mehr als einer ÜE benutzen will.
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum nicht antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.