webentwicklung-frage-antwort-db.com.de

Warum können wir Mitglieder nicht innerhalb einer Struktur initialisieren?

Warum können wir Mitglieder nicht innerhalb einer Struktur initialisieren?

beispiel:

struct s {
   int i = 10;
};
44
Santhosh

Wenn Sie nicht statisch mit struct deklarieren möchten, :

In C++ (nicht C) sind structs fast synonym für Klassen und können im Konstruktor Member initialisiert werden.

struct s {
    int i;

    s(): i(10)
    {
    }
};

Wenn Sie eine Instanz initialisieren wollen :

In C oder C++:

struct s {
    int i;
};

...

struct s s_instance = { 10 };

C99 hat auch eine Funktion namens Designierte Initialisierer:

struct s {
    int i;
};

...

struct s s_instance = {
    .i = 10,
};

Es gibt auch eine GNU C-Erweiterung, die C99-Initialisierern sehr ähnlich ist, aber es ist besser, etwas tragbareres zu verwenden:

struct s s_instance = {
    i: 10,
};
38
Alex B

Die direkte Antwort ist, weil die Strukturdefinition einen Typ deklariert und keine Variable, die initialisiert werden kann. Ihr Beispiel ist:

struct s { int i=10; };

Dies deklariert keine Variablen - es definiert einen Typ. Um eine Variable zu deklarieren, fügen Sie einen Namen zwischen dem } und dem ; hinzu und initialisieren Sie ihn anschließend:

struct s { int i; } t = { 10 };

Wie Checkers feststellte, können Sie in C99 auch bestimmte Initialisierer verwenden (was eine wunderbare Verbesserung ist - eines Tages wird C mit den anderen Funktionen, die Fortran 66 für die Dateninitialisierung hatte, aufholen können, wobei sich der Initialisierer vorwiegend wiederholt). Bei dieser einfachen Struktur gibt es keinen Nutzen. Wenn Sie eine Struktur mit beispielsweise 20 Mitgliedern haben und nur eines davon initialisieren mussten (beispielsweise, weil Sie ein Flag haben, das angibt, dass der Rest der Struktur initialisiert ist oder nicht), ist dies sinnvoller:

struct s { int i; } t = { .i = 10 };

Diese Notation kann auch verwendet werden, um Vereinigungen zu initialisieren, um zu bestimmen, welches Element der Vereinigung initialisiert wird.

33

Beachten Sie, dass in C++ 11 jetzt die folgende Deklaration zulässig ist:

struct s {
   int i = 10;
};

Dies ist eine alte Frage, aber sie hat einen hohen Stellenwert bei Google und könnte ebenso klargestellt werden.

12
Turtlesoft

Edit: Die Frage wurde ursprünglich mit c++ markiert, aber auf dem Poster wurde vermerkt, dass es sich um c handelt. Ich habe die Frage dann mit einem neuen Tag versehen.

In C++ ist eine struct nur eine class, die public anstelle von private für Mitglieder und Vererbung verwendet. 

In C++ können nur static const integral-Member inline initialisiert werden, andere Member müssen im Konstruktor initialisiert werden, oder wenn struct in einer Initialisierungsliste eine POD ist (beim Deklarieren der Variablen).

struct bad {
    static int answer = 42; // Error! not const
    const char* question = "what is life?"; // Error! not const or integral
};

struct good {
    static const int answer = 42; // OK
    const char* question;
    good() 
        : question("what is life?") // initialization list
        { }
};

struct pod { // plain old data
    int answer;
    const char* question;
};
pod p = { 42, "what is life?" };
8
Motti

Wir können nicht initialisieren, da wir, wenn wir eine Struktur deklariert haben, als das, was wir tatsächlich tun, den Compiler einfach über seine Anwesenheit informieren, d. H., Es wird kein Speicher zugewiesen und wenn ein Member ohne Speicher dafür initialisiert wird. Normalerweise geschieht dies, wenn wir eine Variable initialisieren, die von der Stelle abhängt, an der der deklarierte Variable-Compiler Speicher für diese Variable reserviert.

int a = 10;
  • wenn es automatisch ist als im Stapelspeicher zugeteilt wird 
  • wenn es global ist als in Datenabschnitten wird der Speicher zugeordnet

Welcher Speicher ist also erforderlich, um diese Daten zu speichern, aber im Falle einer Struktur ist kein Speicher dort möglich, um sie zu initialisieren.

2
Anup Raj Dubey

Wie Sie sagten, ist es nur ein Mitglied, keine Variable. Wenn Sie eine Variable deklarieren, stellt der Compiler auch Speicherplatz für die Variablen zur Verfügung, in die Sie Werte eingeben können. Im Falle eines Strukturmembers gibt der Compiler keinen Speicherplatz für ihn an. Daher können Sie Strukturmementen nur dann Werte zuweisen, wenn Sie eine Variable dieses Strukturtyps erstellen.

0
Ajay Sivan