2015-10-12 84 views
14

Tôi chỉ đọc some code trong st terminal emulator và đã xem qua cú pháp này:Trong C nghĩa là gì [foo] = bar nghĩa là gì?

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

Tôi chưa bao giờ thấy cú pháp này trong C và tôi thậm chí không chắc chắn những gì để google cho. Tôi có một ý tưởng thô những gì nó làm (xác định xử lý như là một mảng các con trỏ hàm), nhưng tôi muốn hiểu cú pháp này tốt hơn. Dường như nó có giá trị ít nhất trong C99, nhưng tôi đang tìm một số chi tiết hơn tại sao điều này là chính xác, chính xác nó hoạt động như thế nào và có thể là con trỏ tới tiêu chuẩn C trong đó cú pháp này được định nghĩa.

+0

Nếu tôi phải mạo hiểm một đoán, nó dường như là một số mảng khởi tạo chỉ mục. –

Trả lời

13

Điều này đang khởi tạo một loạt các con trỏ hàm với chỉ mục enum. Xem here.

Như đã đề cập trong các nhận xét dưới đây sử dụng Designated Initializers.

Ví dụ ngắn này sẽ cho biết cách sử dụng nó.

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]); 

này in ra

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

@Ianoxx đã yêu cầu một con trỏ tới tiêu chuẩn C. "Trình khởi tạo được chỉ định" được mô tả trong khoản khoản 6,7.8 khoản 17. Ví dụ cụ thể là VÍ DỤ 9 –