C功能说明

Rub*_*raz 15 c xv6

有人可以向我解释一下这个函数的语法吗?其中SYS_fork是常量,sys_fork是一个函数.

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,
};
Run Code Online (Sandbox Code Playgroud)

谢谢!

use*_*016 26

您刚刚遇到使用指定的初始化程序.它们存在于C99中,也可用作GCC扩展,广泛用于Linux内核代码(以及其他).

来自文档:

在ISO C99中,您可以按任何顺序给出[数组]元素,指定它们适用的数组索引或结构字段名称,GNU C也允许它作为C90模式的扩展.[...]

要指定数组索引,请在元素值之前写入"[index] =".例如,

int a[6] = { [4] = 29, [2] = 15 };
Run Code Online (Sandbox Code Playgroud)

相当于:

int a[6] = { 0, 0, 15, 0, 29, 0 };
Run Code Online (Sandbox Code Playgroud)

[...]

自GCC 2.5以来已经过时的替代语法已经过时,但GCC仍然接受的是在元素值之前写'[index]',没有'='.

简单来说,syscalls是一个指向函数获取void和返回的指针的静态数组int.数组索引是常量,它们的相关值是相应的函数地址.

  • 发布的代码不会根据该描述需要`='的标志吗? (4认同)
  • @Abhishek它们可能在代码中的其他地方定义.例如,作为枚举:`enum {SYS_fork,SYS_exit,...};`.这将创建一组标识符,其行为可以用作索引的常量(0,1,...).它们也可能被定义为宏. (3认同)
  • @dolan从您发布的链接:"自GCC 2.5以来已经过时的替代语法,但GCC仍然接受的是在元素值之前编写`[index]`,没有`=`." (3认同)