Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: FAQ - C++ (auch C++0x, C++11) ::  Unterschied: Deklaration, Definition, Initialisierung     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
FUNPAQ
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.09.2003
Beiträge: 72
Beitrag FUNPAQ Mitglied 20:08:26 12.01.2004   Titel:   Unterschied: Deklaration, Definition, Initialisierung            Zitieren

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 :D) 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 (...:D) 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
Werbeunterbrechung
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 17577
Beitrag Shade Of Mine Moderator 20:36:36 12.01.2004   Titel:              Zitieren

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
C/C++ Code:
class Test;
C/C++ Code:
class Test;
C/C++ Code:
class Test;


Dies führt mich zur ODR (One Definition Rule). Sie besagt, dass jedes Symbol nur einmal definiert werden darf. HumeSikkins erklärt dies auf seiner Homepage sehr schön.

Als Übung sei dem geneigten Leser folgendes überlassen:

C/C++ Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
class Test; //1

class Test {}; //2

int func() { return 7;} //3

extern int i=func(); //4

Test obj(); //5
C/C++ Code:
1
2
3
4
5
6
7
8
9
class Test; //1

class Test {}; //2

int func() { return 7;} //3

extern int i=func(); //4

Test obj(); //5
C/C++ Code:
1
2
3
4
5
6
7
8
9
class Test; //1

class Test {}; //2

int func() { return 7;} //3

extern int i=func(); //4

Test obj(); //5



Die Lösung:
1) Deklaration
2) Definition
3) Definition
4) Initialisierung
5) Deklaration

_________________
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
HumeSikkins
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.08.2000
Beiträge: 11139
Beitrag HumeSikkins Mitglied 22:40:05 12.01.2004   Titel:              Zitieren

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
pumuckl
Moderator

Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 6317
Beitrag pumuckl Moderator 20:02:07 16.08.2010   Titel:              Zitieren

krümelkacker schrieb:
So werden die Begriffe Deklaration und Definition im offiziellen C++ Standard benutzt:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class foo;          // <-- Deklaration von foo

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
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class foo; // <-- Deklaration von foo

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
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class foo;          // <-- Deklaration von foo

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.


_________________
Du brauchst Hilfe? - Kleines Einmaleins der Forenregeln.
When your hammer is C++, everything begins to look like a thumb. (Steve Haflich)
C/C++ Forum :: FAQ - C++ (auch C++0x, C++11) ::  Unterschied: Deklaration, Definition, Initialisierung   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

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.