Zoeken…


Syntaxis

  • (type) {initialisatielijst}

Opmerkingen

C-norm zegt in C11-§6.5.2.5 / 3:

Een postfix-expressie die bestaat uit een haakjes typenaam gevolgd door een accolade ingesloten lijst met initializers is een samengestelde letterlijke waarde . Het biedt een naamloos object waarvan de waarde wordt gegeven door de initialisatielijst. 99)

en voetnoot 99 zegt:

Merk op dat dit verschilt van een cast-uitdrukking. Een cast geeft bijvoorbeeld een conversie naar scalaire typen of alleen void op en het resultaat van een cast-expressie is geen waarde.

Let daar op:

Stringliterals en samengestelde literals met const-gekwalificeerde typen, hoeven geen afzonderlijke objecten aan te duiden. 101)

101) Hierdoor kunnen implementaties opslag delen voor stringliterals en constante samengestelde literals met dezelfde of overlappende representaties.

Voorbeeld wordt gegeven in standaard:
C11-§6.5.2.5 / 13:

Net als stringliterals kunnen const-gekwalificeerde samengestelde literals in het alleen-lezen geheugen worden geplaatst en zelfs worden gedeeld. Bijvoorbeeld,

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

kan 1 opleveren als de opslag van de literalen wordt gedeeld.

Definitie / initialisatie van samengestelde literatuur

Een samengestelde letterlijke waarde is een naamloos object dat wordt gemaakt in het bereik waar is gedefinieerd. Het concept werd voor het eerst geïntroduceerd in de C99-standaard. Een voorbeeld voor samengestelde letterlijk is

Voorbeelden uit C-norm, C11-§6.5.2.5 / 9:

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

p wordt geïnitialiseerd op het adres van het eerste element van een naamloze array van twee int.

De samengestelde letterlijke waarde is een waarde. De opslagduur van het niet-genoemde object is statisch (als het letterlijke wordt weergegeven bij bestandsbereik) of automatisch (als het letterlijke wordt weergegeven bij blokbereik), en in het laatste geval eindigt de levensduur van het object wanneer de besturing het omsluitende blok verlaat.

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

p wordt het adres toegewezen van het eerste element van een array van twee ints, waarbij de eerste de waarde heeft waarnaar eerder is verwezen door p en de tweede nul. [...]

Hier blijft p geldig tot het einde van het blok.

Samengestelde letterlijk met aanduiders

(ook van 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});

Een fictieve drawline ontvangt twee argumenten van het type struct point . De eerste heeft coördinaatwaarden x == 1 en y == 1 , terwijl de tweede x == 3 en y == 4

Letterlijke samenstelling zonder matrixlengte op te geven

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

In dit geval is de grootte van de array niet opgegeven, deze wordt bepaald door de lengte van de initialisatie.

Verbinding letterlijk met een initialisatie-lengte die kleiner is dan de opgegeven matrixgrootte

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

de rest van de elementen van samengestelde letterlijk worden impliciet op 0 geïnitialiseerd.

Alleen-lezen verbinding letterlijk

Merk op dat een letterlijke samenstelling een waarde is en dat de elementen ervan dus kunnen worden gewijzigd. Een alleen-lezen samengestelde letterlijke waarde kan worden opgegeven met behulp van const qualifier as (const int[]){1,2} .

Samengestelde letterlijke tekst die willekeurige uitdrukkingen bevat

Binnen een functie kan een letterlijke samenstelling, zoals voor elke initialisatie sinds C99, willekeurige uitdrukkingen hebben.

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow