2015-10-12 34 views
14

właśnie czyta some code w st terminal emulator i natknąłem tej składni:W C co oznacza [foo] = bar?

static void (*handler[LASTEvent])(XEvent *) = { 
    [KeyPress] = kpress, 
    [ClientMessage] = cmessage, 
    /* Removed some lines for brevity ... */ 
}; 

Nigdy nie widziałem tej składni w C i nie jestem nawet pewien, co do google. Mam przybliżony pomysł, co robi (definiowanie programu obsługi jako tablicy wskaźników funkcji), ale chciałbym lepiej zrozumieć tę składnię. Wydaje się być poprawne przynajmniej w C99, ale szukam więcej szczegółów, dlaczego to jest poprawne, jak dokładnie działa i może wskaźnik do standardu C, gdzie ta składnia jest zdefiniowana.

+0

Gdybym miał zgadywać, to wydaje się, że niektóre indeksowane inicjalizacji tablicy. –

Odpowiedz

13

Jest to inicjalizacja tablicy wskaźników funkcyjnych z indeksami wyliczeniowymi. Zobacz here.

Jak wspomniano w komentarzach poniżej używa Designated Initializers.

Ten krótki przykład powinien pokazać, jak można go użyć.

enum indexes {ZERO, ONE, TWO, FOUR=4}; 
int array[5] = {[FOUR]=1, [TWO]=9}; 

for(int i = 0; i < 5; i++) 
    printf("%d, ", array[i]); 

ten wypisuje

0, 0, 9, 0, 1, 
+2

@Ianoxx poprosił o wskaźnik do standardu C. "Wyznaczone inicjalizatory" opisano w pkt 6.7.8 pkt 17. Konkretny przykład to PRZYKŁAD 9 –