Suche…


Syntax

  • (Typ) {Initialisierungsliste}

Bemerkungen

C-Standard sagt in C11-§6.5.2.5 / 3:

Ein Postfix-Ausdruck, der aus einem eingeklammerten Typnamen gefolgt von einer in Klammern eingeschlossenen Liste von Initialisierern besteht, ist ein zusammengesetztes Literal . Es stellt ein unbenanntes Objekt bereit, dessen Wert von der Initialisierungsliste angegeben wird. 99)

und Fußnote 99 sagt:

Beachten Sie, dass sich dies von einem Besetzungsausdruck unterscheidet. Eine Umwandlung gibt beispielsweise eine Konvertierung in Skalartypen oder nur eine Leere an , und das Ergebnis eines Umwandlungsausdrucks ist kein Wert.

Beachten Sie, dass:

String-Literale und zusammengesetzte Literale mit const-qualifizierten Typen müssen keine unterschiedlichen Objekte definieren. 101)

101) Dies ermöglicht Implementierungen, um den Speicher für Stringliterale und konstante zusammengesetzte Literale mit der gleichen oder überlappenden Darstellung zu teilen.

Beispiel ist in Standard angegeben:
C11-§6.5.2.5 / 13:

Wie String-Literale können const-qualifizierte Verbundliterale in den Nur-Lese-Speicher gestellt und sogar geteilt werden. Zum Beispiel,

(const char []){"abc"} == "abc"

kann 1 ergeben, wenn der Speicher der Literale gemeinsam genutzt wird.

Definition / Initialisierung von zusammengesetzten Literalen

Ein zusammengesetztes Literal ist ein unbenanntes Objekt, das in dem definierten Bereich erstellt wird. Das Konzept wurde erstmals im C99-Standard eingeführt. Ein Beispiel für zusammengesetzte Wörter ist

Beispiele aus dem C-Standard C11-§6.5.2.5 / 9:

int *p = (int [2]){ 2, 4 };

p wird auf die Adresse des ersten Elements eines unbenannten Arrays von zwei Ints initialisiert.

Das zusammengesetzte Literal ist ein Wert. Die Speicherdauer des unbenannten Objekts ist entweder statisch (wenn das Literal im Dateibereich angezeigt wird) oder automatisch (wenn das Literal im Blockbereich angezeigt wird). In letzterem Fall endet die Lebensdauer des Objekts, wenn die Steuerung den umgebenden Block verlässt.

void f(void)
{
    int *p;
    /*...*/
    p = (int [2]){ *p };
    /*...*/
}

p wird der Adresse des ersten Elements eines Arrays von zwei Ints zugewiesen, wobei das erste den Wert hat, auf den zuvor p und das zweite, Null.

Hier bleibt p bis zum Ende des Blocks gültig.

Zusammengesetztes Literal mit Bezeichnern

(auch ab C11)

  struct point {
    unsigned x;
    unsigned y;
  };

  extern void drawline(struct point, struct point);

 // used somewhere like this
 drawline((struct point){.x=1, .y=1}, (struct point){.x=3, .y=4});

Eine fiktive Funktion drawline empfängt zwei Argumente vom Typ struct point . Der erste hat Koordinatenwerte x == 1 und y == 1 , während der zweite x == 3 und y == 4

Zusammengesetztes Literal ohne Angabe der Arraylänge

int *p = (int []){ 1, 2, 3};  

In diesem Fall wird die Größe des Arrays nicht angegeben und dann von der Länge des Initialisierers bestimmt.

Zusammengesetztes Literal, dessen Initialisierungslänge weniger als die angegebene Arraygröße ist

int *p = (int [10]){1, 2, 3}; 

Die restlichen Elemente des zusammengesetzten Literal werden implizit auf 0 .

Schreibgeschütztes zusammengesetztes Literal

Beachten Sie, dass ein zusammengesetztes Literal ein Wert ist und seine Elemente daher modifiziert werden können. Ein schreibgeschütztes zusammengesetztes Literal kann mit const Qualifier als (const int[]){1,2} .

Zusammengesetztes Literal mit beliebigen Ausdrücken

Innerhalb einer Funktion kann ein zusammengesetztes Literal wie für jede Initialisierung seit C99 beliebige Ausdrücke haben.

void foo()
{
    int *p;
    int i = 2; j = 5;
    /*...*/
    p = (int [2]){ i+j, i*j };
    /*...*/
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow