這篇文章接續上一篇的話題
來紀錄一些更加奇怪的寫法以及如何解讀
最後也會紀錄一下我看過的一個 pointer to function 的例子
[]
跟 ()
優先於 *
例一:
int *ap[10];
基於原則 b) 應該解讀成 array of pointers (array 先解讀,再解讀pointer)
而非 pointer of array
例二:
float *fp(float)
function (先解讀(float)
) that returns a pointer (再解讀float *
)
例三:
float (*fp)(int)
type of fp
:
(*fp)
因 a) 由內而外)int
argument (先解讀 ()
)例四:
int *(*x[10])(void)
type of x
:
int f(int)[]; /*** WRONG ***/
不可回傳 function
int g(int)(int); /*** WRONG ***/
array of funtionis 不成立,
個人的解讀是,array 的每個 element 都要相同大小才行:
int a[10](int); /*** WRONG ***/
(但 array of function to pointer 是可以的)
在 xv6-riscv 中的 kernel/syscall.c:108 也用到了這種複雜的宣告:
static uint64 (*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,
[SYS_fstat] sys_fstat,
[SYS_chdir] sys_chdir,
[SYS_dup] sys_dup,
[SYS_getpid] sys_getpid,
[SYS_sbrk] sys_sbrk,
[SYS_sleep] sys_sleep,
[SYS_uptime] sys_uptime,
[SYS_open] sys_open,
[SYS_write] sys_write,
[SYS_mknod] sys_mknod,
[SYS_unlink] sys_unlink,
[SYS_link] sys_link,
[SYS_mkdir] sys_mkdir,
[SYS_close] sys_close,
};
syscalls
應該被解讀成:
C Programming: A Modern Approach, 2/e