617 Stimmen

Initialisierung einer Struktur in Übereinstimmung mit den Standards der Programmiersprache C

Ich möchte ein struct-Element initialisieren, aufgeteilt in Deklaration und Initialisierung. Dies ist, was ich habe:

typedef struct MY_TYPE {
  bool flag;
  short int value;
  double stuff;
} MY_TYPE;

void function(void) {
  MY_TYPE a;
  ...
  a = { true, 15, 0.123 }
}

Ist dies der Weg, um eine lokale Variable von MY_TYPE in Übereinstimmung mit den Standards der Programmiersprache C (C89, C90, C99, C11, etc.)? Oder gibt es etwas Besseres oder zumindest Funktionierendes?

Update Am Ende hatte ich ein statisches Initialisierungselement, in dem ich jedes Unterelement nach meinen Bedürfnissen einstellte.

986voto

philant Punkte 32877

In (ANSI) C99 können Sie eine designierter Initialisierer um eine Struktur zu initialisieren:

MY_TYPE a = { .flag = true, .value = 123, .stuff = 0.456 };

Andere Mitglieder werden mit Null initialisiert: "Ausgelassene Feldmitglieder werden implizit genauso initialisiert wie Objekte, die eine statische Speicherdauer haben." ( https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html )

269voto

CesarB Punkte 41671

Sie können es mit einer zusammengesetztes Literal . Laut dieser Seite funktioniert es in C99 (was auch als ANSI C ).

MY_TYPE a;

a = (MY_TYPE) { .flag = true, .value = 123, .stuff = 0.456 };
...
a = (MY_TYPE) { .value = 234, .stuff = 1.234, .flag = false };

Die Bezeichnungen in den Initialisierern sind optional; Sie könnten auch schreiben:

a = (MY_TYPE) { true,  123, 0.456 };
...
a = (MY_TYPE) { false, 234, 1.234 };

116voto

Ron Nuni Punkte 1585

Wie ich sehe, haben Sie bereits eine Antwort zu ANSI C 99 erhalten, also werde ich Ihnen eine Antwort zu ANSI C 89 geben. ANSI C 89 erlaubt Ihnen, eine Struktur auf diese Weise zu initialisieren:

typedef struct Item {
    int a;
    float b;
    char* name;
} Item;

int main(void) {
    Item item = { 5, 2.2, "George" };
    return 0;
}

Es ist wichtig, sich daran zu erinnern, dass in dem Moment, in dem Sie auch nur ein Objekt/eine Variable in der Struktur initialisieren, alle anderen Variablen mit dem Standardwert initialisiert werden.

Wenn Sie die Werte in Ihrer Struktur nicht initialisieren, werden alle Variablen "Müllwerte" enthalten.

Viel Glück!

51voto

qrdl Punkte 32507

a = (MYTYPE){ true, 15, 0.123 };

würde in C99 gut funktionieren

25voto

PF4Public Punkte 664

Standard der Programmiersprache C ISO/IEC 9899:1999 (allgemein bekannt als C99) erlaubt die Verwendung einer designierter Initialisierer um Mitglieder einer Struktur oder Vereinigung wie folgt zu initialisieren:

MY_TYPE a = { .stuff = 0.456, .flag = true, .value = 123 };

Sie ist definiert in paragraph 7 Abschnitt 6.7.8 Initialization der Norm ISO/IEC 9899:1999 als:

Wenn ein Bezeichner die folgende Form hat
. Kennung
dann muss das aktuelle Objekt (wie unten definiert) vom Typ Struktur oder Union sein und der Bezeichner muss der Name eines Mitglieds dieses Typs sein.

Beachten Sie, dass paragraph 9 desselben Abschnitts besagt Folgendes:

Sofern nicht ausdrücklich anders angegeben, nehmen unbenannte Mitglieder von Objekten vom Typ Struktur und Union im Sinne dieses Unterabschnitts nicht an der Initialisierung teil. Unbenannte Mitglieder von Strukturobjekten haben auch nach der Initialisierung einen unbestimmten Wert.

In der GNU GCC-Implementierung werden ausgelassene Mitglieder jedoch als Null oder Null-ähnlicher, typgerechter Wert initialisiert. Wie im Abschnitt 6.27 Bezeichnete Initialisierer der GNU GCC-Dokumentation:

Ausgelassene Feldmitglieder werden implizit genauso initialisiert wie Objekte, die eine statische Speicherdauer haben.

Microsoft Visual C++ Compiler soll laut offiziellem Blog-Post ab Version 2013 designierte Initialisierer unterstützen C++ Konformität Roadmap . Absatz Initializing unions and structs von Initialisierungen Artikel in der MSDN Visual Studio-Dokumentation schlägt vor, dass unbenannte Mitglieder ähnlich wie bei GNU GCC auf Nullwerte initialisiert werden.

ISO/IEC 9899:2011 Norm (allgemein bekannt als C11), die die ISO/IEC 9899:1999 abgelöst hatte, behält die Initialisierungsprogramme unter Abschnitt 6.7.9 Initialization . Es behält auch die paragraph 9 unverändert.

Neu ISO/IEC 9899:2018 Norm (allgemein bekannt als C18), die die ISO/IEC 9899:2011 abgelöst hatte, behält die Initialisierungen unter Abschnitt 6.7.9 Initialization . Es behält auch die paragraph 9 unverändert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X