Frage C++ Definition und Deklaration

Gast #7304405
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

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

#7304422
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

Gast #7304445
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.

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren