Was unterscheidet die Deklaration, die Definition und die Initialisierung einer Variablen?

Lesezeit: 6 Minuten

Tonys Benutzeravatar
Toni

Nachdem ich die Frage gelesen habe, kenne ich die Unterschiede zwischen Deklaration und Definition. Bedeutet es also, dass Definition gleich Deklaration plus Initialisierung ist?

  • Initialisierung ist für Variablen. Die Definition kann auch für Funktionen gelten, bei denen Sie den Körper definieren.

    – FKaria

    28. April 2014 um 15:51 Uhr

  • Also meinst du für eine Variable, es ist richtig.

    – Toni

    28. April 2014 um 15:53 ​​Uhr

Benutzeravatar von Shoe
Schuh

Erklärung

Deklaration bezieht sich im Allgemeinen auf die Einführung eines neuen Namens in das Programm. Zum Beispiel können Sie erklären eine neue Funktion durch Beschreibung ihrer “Signatur”:

void xyz();

oder einen unvollständigen Typ deklarieren:

class klass;
struct ztruct;

und nicht zuletzt, um ein Objekt zu deklarieren:

int x;

Es wird im C++-Standard unter §3.1/1 wie folgt beschrieben:

Eine Deklaration (Abschnitt 7) kann einen oder mehrere Namen in eine Übersetzungseinheit einführen oder Namen neu deklarieren, die durch frühere Deklarationen eingeführt wurden.

Definition

Eine Definition ist eine Definition eines zuvor deklarierten Namens (oder es kann sowohl eine Definition als auch eine Deklaration sein). Zum Beispiel:

int x;
void xyz() {...}
class klass {...};
struct ztruct {...};
enum { x, y, z };

Insbesondere der C++-Standard definiert es unter §3.1/1 wie folgt:

Eine Deklaration ist eine Definition, es sei denn, sie deklariert eine Funktion, ohne den Rumpf der Funktion anzugeben (8.4), sie enthält den extern-Spezifizierer (7.1.1) oder eine Linkage-Spezifikation25 (7.5) und weder einen Initialisierer noch einen Funktionsrumpf, sie deklariert a statisches Datenelement in einer Klassendefinition (9.2, 9.4), es ist eine Klassennamendeklaration (9.1), es ist eine opaque-enum-Deklaration (7.2), es ist ein Template-Parameter (14.1), es ist ein Parameter- -Deklaration (8.3.5) in einem Funktionsdeklarator, der nicht der Deklarator einer Funktionsdefinition ist, oder es ist eine Typedef-Deklaration (7.1.3), eine Alias-Deklaration (7.1.3), eine Using-Deklaration (7.3. 3), eine static_assert-Deklaration (Klausel 7), eine Attribut-Deklaration (Klausel 7), eine Leer-Deklaration (Klausel 7) oder eine Using-Direktive (7.3.4).

Initialisierung

Initialisierung bezieht sich auf die “Zuweisung” eines Wertes zur Konstruktionszeit. Für ein generisches Objekt vom Typ Tes hat oft die Form:

T x = i;

aber in C++ kann es sein:

T x(i);

oder auch:

T x {i};

mit C++11.

Fazit

Bedeutet es also, dass Definition gleich Deklaration plus Initialisierung ist?

Es hängt davon ab, ob. Worüber Sie sprechen. Wenn Sie zum Beispiel über ein Objekt sprechen:

int x;

Dies ist eine Definition ohne Initialisierung. Das Folgende ist stattdessen eine Definition mit Initialisierung:

int x = 0;

In bestimmten Zusammenhängen macht es keinen Sinn, von „Initialisierung“, „Definition“ und „Deklaration“ zu sprechen. Wenn Sie beispielsweise von einer Funktion sprechen, Initialisierung bedeutet nicht viel.

Die Antwort lautet also nein: Definition bedeutet nicht automatisch Deklaration plus Initialisierung.

  • Nicht ganz: int x; ist sowohl eine Definition als auch eine Erklärung.

    – Angew ist nicht mehr stolz auf SO

    28. April 2014 um 16:06 Uhr

  • @Angew, danke, ich habe eine vollständigere hinzugefügt Definition.

    – Schuh

    28. April 2014 um 16:16 Uhr

  • Ich denke, die Frage, die OP in seinem Beitrag erwähnt hat, beantwortet die Definition und Deklaration ziemlich gut. Aber die ursprüngliche Frage war So does it mean definition equals declaration plus initialization.

    – Talil

    28. April 2014 um 16:34 Uhr

  • @Tahlil, fügte eine Schlussfolgerung hinzu. Danke, dass du mich darauf aufmerksam gemacht hast.

    – Schuh

    28. April 2014 um 16:45 Uhr

  • @Tony Ich denke (bitte korrigiert mich jemand, wenn ich falsch liege, damit ich es lerne) ‘extern int x’ macht es nur zu einer Deklaration, was bedeutet, dass die Definition an anderer Stelle zu finden ist. Während „int x“ es tatsächlich definiert, obwohl es mit einem zufälligen Garbage-Wert versehen wird, es sei denn, Sie initialisieren es speziell wie „int x = 5“.

    – Göre

    8. November 2017 um 16:36 Uhr

Leichtigkeitsrennen im Benutzeravatar von Orbit
Leichtigkeitsrennen im Orbit

Deklaration sagt “dieses Ding existiert irgendwo”:

int foo();       // function
extern int bar;  // variable
struct T
{
   static int baz;  // static member variable
};

Definition sagt “dieses Ding existiert hier; mache dir eine Erinnerung dafür”:

int foo() {}     // function
int bar;         // variable
int T::baz;      // static member variable

Die Initialisierung ist zum Zeitpunkt der Definition von Objekten optional und besagt “hier ist der Anfangswert für dieses Ding”:

int bar = 0;     // variable
int T::baz = 42; // static member variable

Manchmal ist es stattdessen am Punkt der Deklaration möglich:

struct T
{
   static int baz = 42;
};

…aber damit kommen wir zu komplexeren Funktionen.

  • Sehr gut erklärt, nur dass die Initialisierung etwas komplexer ist. (Dies wäre nicht C++, wenn es so einfach wäre.) Die Initialisierung umfasst Dinge wie die Nullinitialisierung von Variablen mit statischer Lebensdauer und Standardkonstruktoren sowie das, was Sie zeigen. (Und um die Verwirrung noch zu verstärken: In C kann die Initialisierung das erste Mal sein, dass die Variable zugewiesen wird; z. B. in Anweisungen wie “den Wert einer nicht initialisierten Variablen nehmen”. Es würde mich nicht überraschen, wenn einiges davon auch hineingerutscht wäre C++.)

    – James Kanze

    28. April 2014 um 17:09 Uhr

  • Oh, und es gibt auch Sonderfälle, in denen C++ die Angabe der Initialisierung in einer Deklaration zulässt.

    – James Kanze

    28. April 2014 um 17:17 Uhr

  • @JamesKanze: Beschlossen, es für diese Zwecke super einfach zu halten

    – Leichtigkeitsrennen im Orbit

    28. April 2014 um 17:40 Uhr

  • Dies ist nicht sinnvoll, statische Member-Variablen weisen Speicher zu.

    – GT77

    22. Januar 2021 um 11:37 Uhr

Crowmans Benutzeravatar
Krähenmann

Zumindest für C gemäß C11 6.7.5:

Eine Deklaration spezifiziert die Interpretation und die Attribute eines Satzes von Bezeichnern. EIN Definition eines Identifikators ist eine Erklärung für diesen Identifikator, dass:

  • für ein Objekt bewirkt, dass Speicher für dieses Objekt reserviert wird;

  • enthält für eine Funktion den Funktionskörper;

  • bei einer Aufzählungskonstante die (einzige) Deklaration des Bezeichners;

  • für einen Typedef-Namen ist die erste (oder einzige) Deklaration des Bezeichners.

Gemäß C11 6.7.9.8-10:

Ein Initialisierer gibt den in einem Objekt gespeicherten Anfangswert an … wenn ein Objekt mit automatischer Speicherung nicht explizit initialisiert wird, ist sein Wert unbestimmt.

Im Großen und Ganzen führt eine Deklaration also einen Identifikator ein und liefert Informationen darüber. Für eine Variable ist eine Definition eine Deklaration, die Speicher für diese Variable zuweist.

Initialisierung ist die Angabe des Anfangswerts, der in einem Objekt gespeichert werden soll, was nicht unbedingt derselbe ist wie beim ersten Mal explizit zuordnen einen Wert dazu. Eine Variable hat einen Wert, wenn Sie sie definieren, unabhängig davon, ob Sie ihr explizit einen Wert zuweisen oder nicht. Wenn Sie ihm nicht explizit einen Wert zuweisen und die Variable automatisch gespeichert wird, hat sie einen Anfangswert, aber dieser Wert ist unbestimmt. Wenn es einen statischen Speicher hat, wird es je nach Typ implizit initialisiert (z. B. werden Zeigertypen auf Nullzeiger initialisiert, arithmetische Typen werden auf Null initialisiert und so weiter).

Wenn Sie also eine automatische Variable definieren, ohne einen Anfangswert dafür anzugeben, wie zum Beispiel:

int myfunc(void) {
    int myvar;
    ...

Sie definieren es (und deklarieren es daher auch, da Definitionen Deklarationen sind), aber initialisieren es nicht. Daher ist Definition nicht gleich Deklaration plus Initialisierung.

  • In C++ ist die Initialisierung deutlich anders. (C hat auch das Äquivalent zur Nullinitialisierung von Objekten mit statischer Lebensdauer.)

    – James Kanze

    28. April 2014 um 17:16 Uhr

  • @JamesKanze: Ja, leider ist diese Frage sowohl mit C als auch mit C++ gekennzeichnet, was in den Punkten, in denen sie sich unterscheiden, nicht sehr hilfreich ist.

    – Krähenmann

    28. April 2014 um 17:20 Uhr

  • Ziemlich. Für die kompatiblen Typen, die Absicht (zumindest ursprünglich) in C++ war, dass sie sich genauso verhalten wie in C; Tatsächlich denke ich, dass sie sich in allen Fällen, in denen die Sprachen selbst kompatibel sind, immer noch gleich verhalten. Aber die Formulierung, die verwendet wird, um dieses Verhalten zu definieren, ist ganz anders.

    – James Kanze

    29. April 2014 um 8:13 Uhr

„Heißt es also, dass Definition gleich Deklaration plus Initialisierung ist.“

Nicht unbedingt, Ihre Deklaration könnte ohne Initialisierung einer Variablen erfolgen, wie:

 void helloWorld(); //declaration or Prototype.

 void helloWorld()
 {
    std::cout << "Hello World\n";
 } 

1420940cookie-checkWas unterscheidet die Deklaration, die Definition und die Initialisierung einer Variablen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy