Ich habe eine Aufgabe, bei der ich verstehen muss, was ist ausgewiesene Initialisierer in C, und was es bedeutet, eine Variable mit eins zu initialisieren.
Ich kenne den Begriff nicht und konnte keine schlüssigen Definitionen finden.
Was ist ein designierter Initialisierer in C?
Designierte Initialisierer gibt es in zwei Varianten:
1) Es bietet eine schnelle Möglichkeit, bestimmte Elemente in einem Array zu initialisieren:
int foo[10] = { [3] = 1, [5] = 2 };
setzt alle Elemente auf foo
auf 0, außer Index 3, der auf 1 gesetzt wird, und Index 5, der auf 2 gesetzt wird.
2) Es bietet eine Möglichkeit zur expliziten Initialisierung struct
Mitglieder. Zum Beispiel für
struct Foo { int a, b; };
Du kannst schreiben
struct Foo foo { .a = 1, .b = 2 };
Beachten Sie, dass in diesem Fall nicht explizit initialisierte Member so initialisiert werden, als ob die Instanz dies getan hätte static
Dauer.
Beide sind Standard-C, aber beachten Sie, dass C++ beides nicht unterstützt (da Konstruktoren die Arbeit in dieser Sprache erledigen können).
Der Designed Initializer kam seit ISO C99 auf und ist eine andere und dynamischere Art, in C beim Initialisieren zu initialisieren struct
, union
oder ein array
.
Der größte Unterschied zur Standardinitialisierung besteht darin, dass Sie die Elemente nicht in einer festen Reihenfolge deklarieren müssen und auch element weglassen können.
Von dem GNU-Leitfaden:
Standard-C90 erfordert, dass die Elemente eines Initialisierers in einer festen Reihenfolge erscheinen, genauso wie die Reihenfolge der Elemente in dem Array oder der Struktur, die initialisiert wird.
In ISO C99 können Sie die Elemente in zufälliger Reihenfolge angeben, indem Sie die Array-Indizes oder Strukturfeldnamen angeben, auf die sie sich beziehen, und GNU C erlaubt dies als Erweiterung im C90-Modus ebenfalls
Beispiele
1. Array-Index
Standardinitialisierung
int a[6] = { 0, 0, 15, 0, 29, 0 };
Gestaltete Initialisierung
int a[6] = {[4] = 29, [2] = 15 }; // or
int a[6] = {[4]29 , [2]15 }; // or
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
2. Struktur oder Vereinigung:
Standardinitialisierung
struct point { int x, y; };
Gestaltete Initialisierung
struct point p = { .y = 2, .x = 3 }; or
struct point p = { y: 2, x: 3 };
3. Kombinieren Sie das Benennen von Elementen mit der gewöhnlichen C-Initialisierung aufeinanderfolgender Elemente:
Standardinitialisierung
int a[6] = { 0, v1, v2, 0, v4, 0 };
Gestaltete Initialisierung
int a[6] = { [1] = v1, v2, [4] = v4 };
4. Sonstiges:
Beschriften der Elemente eines Array-Initialisierers
int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };
schreiben Sie eine Reihe von ‘.fieldname’ und ‘[index]’ Bezeichner vor einem ‘=’, um ein zu initialisierendes verschachteltes Unterobjekt anzugeben
struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };
Führer
Schau hier gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Designated-Inits.html
– CIsForCookies
9. November 2017 um 13:05 Uhr
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, da keine ernsthaften Nachforschungen angestellt wurden.
– chux – Wiedereinsetzung von Monica
9. November 2017 um 13:09 Uhr
@chux negativ, ich habe nach einem Duplikat dafür gesucht, konnte aber keins finden, nur einige, die zeigen, wie man initialisiert entweder eine Anordnung oder eine Struktur, aber nicht einmal beides.
– Antti Haapala – Слава Україні
9. November 2017 um 13:19 Uhr
@chux SO soll eine Sammlung hochwertiger Antworten auf relevante Fragen sein, oder? Als es passierte, ich hatte heute diese Frage und war froh, Bathsebas kurze Antwort an einem Ort zu finden, dem ich vertrauen kann. (Ja, ich sollte meine eigene Kopie des C11-Standards haben, aber leider habe ich das nicht. Außerdem sind die Standards nicht immer die besten Orte für Normalsterbliche, um Antworten zu finden, also scheinen ein Q und ein A hier perfekt zu sein angemessen.)
– Steve Gipfel
3. Juli 2018 um 17:37 Uhr
Ich habe gerade gesehen, wie Jason hier auf dem C++ Weekly-Kanal darüber erklärt hat youtube.com/watch?v=44rs_hX1dxE
– Tien Do
19. Dezember 2018 um 1:02 Uhr