Forum: PC-Programmierung Frage C++ Definition und Deklaration


von Klose (Gast)


Lesenswert?

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
 int member; // 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"
1
double sqrt(double d) { /* . . . */ }// definition
2
double sqrt(double d) { /* . . . */ }// error: double definition
3
4
int a;// definition 
5
int a;// error: double definition

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

von g457 (Gast)


Lesenswert?

> 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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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
extern int member;
2
3
class Foo
4
{
5
   Foo(){}
6
};
7
8
int bar();

Da werden Namen (Identifier) und dazugehörige Typen definiert, aber 
nichts tatsächlich angelegt.

Die Deklarationen dazu:
1
int member;
2
3
Foo foo{};
4
5
int bar()
6
{
7
   return 0;
8
}

Oliver

von db8fs (Gast)


Lesenswert?

>"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.

von jojo (Gast)


Lesenswert?

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 :)

von Oliver S. (oliverso)


Lesenswert?

jojo schrieb:
> Typo, das sind die Definitionen :)

Schxxx. Dreimal durchgelesen, immer noch verkehrt ;)

Oliver

von Rolf M. (rmagnus)


Lesenswert?

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
class X;

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.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.