C Language
Sammansatta bokstäver
Sök…
Syntax
- (typ) {initieringslista}
Anmärkningar
C-standarden säger i C11-§6.5.2.5 / 3:
Ett postfixuttryck som består av ett parentesiserat typnamn följt av en bifogad lista med initialer är en sammansatt bokstavlig . Det tillhandahåller ett namn som inte namnges vars värde anges av initialiseringslistan. 99)
och fotnot 99 säger:
Observera att detta skiljer sig från ett cast-uttryck. Till exempel specificerar en roll en konvertering till skalartyper eller endast tomrum , och resultatet av ett cast-uttryck är inte en lvalue.
Anteckna det:
Stränglitteraler och sammansatta bokstäver med konst-kvalificerade typer behöver inte beteckna distinkta föremål. 101)
101) Detta tillåter implementeringar att dela lagring för stränglitteraler och konstant sammansatta bokstäver med samma eller överlappande representationer.
Exempel ges i standard:
C11-§6.5.2.5 / 13:
Liksom strängbokstäver kan const-kvalificerade sammansatta bokstäver placeras i skrivskyddat minne och till och med delas. Till exempel,
(const char []){"abc"} == "abc"
kan ge 1 om bokstavernas lagring delas.
Definition / initialisering av sammansatta litteraler
En sammansatt bokstavsform är ett obetecknat objekt som skapas i det område där det definieras. Konceptet introducerades först i C99-standarden. Ett exempel på sammansatt bokstavs är
Exempel från C-standard, C11-§6.5.2.5 / 9:
int *p = (int [2]){ 2, 4 };
p
initialiseras till adressen till det första elementet i ett icke namngivet array av två ints.
Föreningen bokstavligen är en lvalue. Lagringstiden för det namngivna objektet är antingen statisk (om bokstäverna visas i filomfånget) eller automatisk (om bokstäverna visas i blockomfång), och i det senare fallet slutar objektets livslängd när kontrollen lämnar det slutna blocket.
void f(void) { int *p; /*...*/ p = (int [2]){ *p }; /*...*/ }
p
tilldelas adressen till det första elementet i en matris med två ints, den första har det värde som tidigare pekats på avp
och det andra, noll. [...]
Här förblir p
giltigt till slutet av blocket.
Sammansatt bokstavligen med beteckningar
(även från 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});
En fiktiv funktion drawline
får två argument av typen struct point
. Den första har koordinatvärden x == 1
och y == 1
, medan den andra har x == 3
och y == 4
Förening bokstavligen utan att ange arrayens längd
int *p = (int []){ 1, 2, 3};
I det här fallet anges inte storleken på matrisen, det bestäms av initialiserarens längd.
Förening bokstavligen med initialiseringslängd mindre än specificerad matrisstorlek
int *p = (int [10]){1, 2, 3};
resten av elementen i sammansatt bokstav kommer att initialiseras till 0
implicit.
Skrivskyddad sammansatt bokstavlig
Observera att en sammansatt bokstavskraft är en lvalue och därför kan dess element vara modifierbara. En skrivskyddad sammansatt bokstav kan specificeras med hjälp av const
kval som (const int[]){1,2}
.
Sammansatt bokstavsinnehållande godtyckliga uttryck
Inuti en funktion kan en sammansatt bokstavlig, som för alla initialiseringar sedan C99, ha godtyckliga uttryck.
void foo()
{
int *p;
int i = 2; j = 5;
/*...*/
p = (int [2]){ i+j, i*j };
/*...*/
}