2014-09-24 127 views
15

有人可以向我解釋這個函數的語法嗎? SYS_fork是一些常量,sys_fork是一個函數。C功能解釋

static int (*syscalls[])(void) = { 
[SYS_fork] sys_fork, 
[SYS_exit] sys_exit, 
[SYS_wait] sys_wait, 
[SYS_pipe] sys_pipe, 
[SYS_read] sys_read, 
[SYS_kill] sys_kill, 
[SYS_exec] sys_exec, 
}; 

謝謝!

+1

很確定這需要更多的上下文。 – 2014-09-24 17:48:10

回答

26

您剛遇到designated initializers的使用。它們存在於C99中,也可用作GCC擴展,廣泛用於Linux內核代碼(等等)。

從文檔:

在ISO C99可以得到[陣列的]中的元素以任何順序,指定它們適用於數組索引或結構字段名,並且GNU C允許這作爲C90模式的擴展。 [...]

要指定數組索引,請在元素值之前寫'[index] ='。例如,

int a[6] = { [4] = 29, [2] = 15 }; 

相當於:

int a[6] = { 0, 0, 15, 0, 29, 0 }; 

[...]

對此的另一種語法因爲GCC 2.5已經過時,但仍GCC接受是寫' [index]'在元素值之前,沒有'='。

用簡單英文,syscalls is a static array of pointer to function taking void and returning int。數組索引是常量,它們的相關值是相應的函數地址。

+0

非常感謝。現在很清楚:) – user2517839 2014-09-24 18:07:11

+3

發佈的代碼是否需要基於該描述的'='s符號? – Tommy 2014-09-24 18:43:45

+0

@dolan:你能解釋一下SYS_fork,SYS_exit .....值如何充當索引? :-) – 2014-09-24 20:19:30