Hallo guten Tag,
weiß jemand was bei einer Deklaration und bei einer Definition bei einem
C++ Programm passiert?
Also man hat am Anfang einen Spezifizierer und dann die Deklaratoren.
1
intmember;// decl-specifier-seq is int // declarator is "member"
Ist das eine reine Definition ?:
1
member=1;
Programming: Principles and Practice Using C++
Dort steht, dass
int a;// definition
eine Definition ist. Aber warum?
>"A definition specifies exactly what a name refers to. In particular, a >definition of a variable sets aside memory for that>variable. Consequently, you can’t define something twice. For example"
Also bei der Deklaration wird dem Kompiler nur bekannt gemacht, dass ein
Name mit einem bestimmten Typ und Eigenschaften vorhanden ist, aber es
wird noch kein Speicherplatz allokiert?
https://code-better.com/declarations-prototypes-definitions-and-implementations-in-c/>A declarations merely tells the compiler how to use something, it does not >actually create anything.>DEFINITIONS: A definition fully specifies an entity. Definitions are where >the
actual creation of the entity in memory takes place. All definitions >are also
declarations, but not all declarations are definitions.
Danke
> Also bei der Deklaration wird dem Kompiler nur bekannt gemacht, dass ein> Name mit einem bestimmten Typ und Eigenschaften vorhanden ist, aber es> wird noch kein Speicherplatz allokiert?
Ja.
Klose schrieb:> Hallo guten Tag,>> weiß jemand was bei einer Deklaration und bei einer Definition bei einem> C++ Programm passiert?
Du meinst speziell von Variablen?
> Also man hat am Anfang einen Spezifizierer und dann die Deklaratoren.> int member; // decl-specifier-seq is int // declarator is> "member"
Das ist eine Definition und eine Deklaration zugleich.
> Ist das eine reine Definition ?:> member = 1;
Nein, das ist eine Zuweisung. Die Variable existiert ja bereits. Es wird
lediglich ihr Wert geändert.
> Programming: Principles and Practice Using C++>> Dort steht, dass>> int a;// definition>> eine Definition ist. Aber warum?
Warum nicht? Dort wird eine Variable namens a angelegt.
>>"A definition specifies exactly what a name refers to. In particular, a>>definition of a variable sets aside memory for that>>variable.
Genau das passiert oben.
> Also bei der Deklaration wird dem Kompiler nur bekannt gemacht, dass ein> Name mit einem bestimmten Typ und Eigenschaften vorhanden ist, aber es> wird noch kein Speicherplatz allokiert?
Bei einer reinen Deklaration. Bei einer Definition, die ja wie hier auch
steht:
> All definitions are also declarations, but not all declarations are> definitions.
zugleich auch Deklaration ist, wird der Speicherplatz allokiert.
Die Definition definiert einen Typ und seinen Identifier, die
Deklaration legt den dann tatsächlich an.
Den Unterschied lässt sich mit den in deinem Beispiel benutzen
"eingebauten" Datentype wie int allerdings nur schlecht zeigen.
Das hier ist sind Deklarationen:
1
externintmember;
2
3
classFoo
4
{
5
Foo(){}
6
};
7
8
intbar();
Da werden Namen (Identifier) und dazugehörige Typen definiert, aber
nichts tatsächlich angelegt.
Die Deklarationen dazu:
>"A definition specifies exactly what a name refers to. In particular, a>definition of a variable sets aside memory for that>variable
Normalerweise ist es schon so zu lesen, wie's da steht. Ein Datentyp
wird deklariert und beschreibt die Speicheraufteilung, wenn aus dem
Datentyp Daten erzeugt/instanziiert werden.
Unter Definition versteht man üblicherweise das Bekanntmachen einer
Variable oder Funktion für den Linker.
Klassen- oder Funktionsdeklarationen werden üblicherweise z.B. in der .h
gemacht, die Definition der Funktionen der Klasse passiert in der .cpp.
Anderer Name für Deklaration ist Prototyp.
Klose schrieb:> Ist das eine reine Definition ?: member = 1;
Nee, ne Zuweisung.
Klose schrieb:> Dort steht, dass>> int a;// definition>> eine Definition ist. Aber warum?
Wenn's eine globale Variable ist, wird ein Symbol für den Linker erzeugt
und die Variable beim ersten Zugriff darauf instanziiert.
Oliver S. schrieb:> Da werden Namen (Identifier) und dazugehörige Typen definiert, aber> nichts tatsächlich angelegt.>> Die Deklarationen dazu:
Typo, das sind die Definitionen :)
Oliver S. schrieb:> Die Definition definiert einen Typ und seinen Identifier, die> Deklaration legt den dann tatsächlich an.
Da wirfst du zwei unterschiedliche Dinge in einen Topf, nämlich Typen
und Variablen. Beide können sowohl deklariert, als auch definiert
werden, ganz unabhängig von einander.
> Das hier ist sind Deklarationen:> extern int member;
Das ist eine Deklaration einer Variablen.
> class Foo> {> Foo(){}> };
Das ist eine Definition eines Typs und darin die Definition eines
Konstruktors.
> int bar();
Das ist eine Deklaration einer Funktion.
db8fs schrieb:> Normalerweise ist es schon so zu lesen, wie's da steht. Ein Datentyp> wird deklariert und beschreibt die Speicheraufteilung, wenn aus dem> Datentyp Daten erzeugt/instanziiert werden.
Eine reine Deklaration eines Datentyps gibt ebenfalls nur den Namen des
Typs an, z.B.:
1
classX;
Eine Definition gibt alle Details des Datentyps bekannt. Dadurch wird
noch nichts erzeugt, aber es ist die Grundlage, um den Typ instanziieren
zu können.
> Unter Definition versteht man üblicherweise das Bekanntmachen einer> Variable oder Funktion für den Linker.
Der Linker hat nicht unbedingt was damit zu tun. Variablen können auch
static oder lokal definiert sein. Dann bekommt der Linker sie gar nicht
erst zu Gesicht.
> Klassen- oder Funktionsdeklarationen werden üblicherweise z.B. in der .h> gemacht, die Definition der Funktionen der Klasse passiert in der .cpp.
Die Definition der Klasse selbst allerdings steht dann im Header.
> Anderer Name für Deklaration ist Prototyp.
Allerdings nur bei Funktionen.
> Wenn's eine globale Variable ist, wird ein Symbol für den Linker erzeugt> und die Variable beim ersten Zugriff darauf instanziiert.
Globale Variablen werden "irgendwann" vor main() erzeugt, nicht erst
beim ersten Zugriff. Das passiert nur bei lokalen static-Variablen.
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang