Was ist ein designierter Initialisierer in C?

Lesezeit: 4 Minuten

Benutzer-Avatar
Benutzer7349461

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?

  • 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

Benutzer-Avatar
Bathseba

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).

  • Schauen Sie sich an Dies für weitere Lektüre über C++. Ich glaube, es ist gut gerüstet für den nächsten Standard.

    – DeiDei

    9. November 2017 um 13:10 Uhr


  • @AnttiHaapala: Ich muss meinen Standard für meinen letzten Kommentar vor der Regellinie ausgraben. (Ach, ich bin auf dem Choo Choo). ich denken es ist richtig.

    – Bathseba

    9. November 2017 um 13:27 Uhr

  • port70.net/~nsz/c/c11/n1570.html#6.7.9p9 zumindest unbenannte Strukturmitglieder werden nicht initialisiert.

    – Antti Haapala – Слава Україні

    9. November 2017 um 13:29 Uhr

  • Die Member (der Variablen), die nicht explizit im Code initialisiert werden, werden vom Compiler automatisch auf 0 initialisiert. Ähnlich wie alle statischen und globalen Variablen werden immer automatisch auf 0 initialisiert, wenn dies nicht explizit im Code erfolgt.

    – Abetancort

    26. Juni 2020 um 12:49 Uhr


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

1324660cookie-checkWas ist ein designierter Initialisierer in C?

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

Privacy policy