2011-11-05 6 views
7

Esiste un punto di sequenza tra le espressioni di inizializzazione dei membri della struttura?Esiste un punto di sequenza tra le inizializzazioni dei membri della struttura?

Ad esempio, è ben definito che il codice qui sotto stamperà sempre "a, b"?

#include <stdio.h> 

typedef struct { 
    char *bytes; 
    int position; 
    int length; 
} Stream; 

typedef struct { 
    char a; 
    char b; 
} Pair; 

char streamgetc(Stream *stream) { 
    return (stream->position < stream->length) ? stream->bytes[stream->position++] : 0; 
} 

int main(void) { 
    Stream stream = {.bytes = "abc", .position = 0, .length = 3}; 
    Pair pair = {.a = streamgetc(&stream), .b = streamgetc(&stream)}; 
    printf("%c, %c\n", pair.a, pair.b); 
    return 0; 
} 

risposta

6

penso §6.7.8-23 lo sistema:

L'ordine in cui si verificano effetti collaterali nella lista di inizializzazione espressioni è non specificata fi cato.

E a proposito letterali composti:

§6.5.2.5-7

Tutte le regole semantiche e vincoli per le liste di inizializzazione in 6.7.8 sono applicabili a letterali composti.

1

No. Si può vedere di persona di cui all'allegato C del C standard (o correnti d'aria n1256, n1516, etc.).

C'è un punto sequenza dopo ogni pieno declarator, e ci saranno ancora luoghi di sequenza dalle espressioni all'interno di inizializzazione che utilizzano && o chiamate funzioni.

Non esiste neanche un punto di sequenza tra gli argomenti di funzione.

func(getc(), getc()); // who knows what order? 
2

Credo che la formulazione rilevante in C99 TC2 (n1124) è in §6.7.8/23:

L'ordine in cui si verificano effetti collaterali tra le espressioni della lista di inizializzazione è non specificato .

La nota dice:

131) In particolare, l'ordine di valutazione non deve essere lo stesso ordine di inizializzazione subobject.

+0

Mi è piaciuto (e ho votato per) l'aggiunta della nota 131, ma sono andato con la risposta più vecchia perché pensavo che entrambi fossero completi. –

+0

Ciò significa che la valutazione delle espressioni associate a diversi elementi è garantita non per sovrapporsi, ma che qualsiasi numero di tali espressioni può essere valutato tra il momento in cui un particolare viene valutato e l'elemento struttura corrispondente viene effettivamente scritto? – supercat