C函数解释

C函数解释,c,xv6,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,

有人能给我解释一下这个函数的语法吗?其中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,
};

谢谢大家!

您刚刚遇到了使用。它们存在于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]”,不使用“=”


用通俗易懂的英语。数组索引是常量,它们的关联值是相应的函数地址

通过运行以下代码,您将知道发生了什么:

#包括
空洞函数_1(char*);
空洞函数_2(char*);
空洞函数_3(char*);
空洞函数_4(char*);
#定义函数1
#定义func_2
#定义函数3
#定义函数4
void(*functab[])(char*)={//注意顺序
[func_2]函数_2,
[func_3]函数_3,
[func_1]函数_1,
[func_4]函数_4
};
int main()
{
int n;
printf(“%s”,“要调用三个函数(1、2、3或4)中的哪一个?\n”);
scanf(“%d”和“&n”);
//以下两个调用方法具有相同的结果
(*functab[n])(“打印'Hello,world'”;//通过函数的函数名调用函数
functab[n](“打印'Hello,world'”;//通过指向函数的函数指针调用函数
返回0;
}
无效函数_1(char*s){printf(“函数_1%s\n,s);}
无效函数_2(char*s){printf(“函数_2%s\n,s);}
无效函数_3(char*s){printf(“函数_3%s\n,s);}
无效函数_4(char*s){printf(“函数_4%s\n,s);}
结果:

Which of the three functions do you want call (1,2, 3 or 4)?
1
function_1 print 'Hello, world'
function_1 print 'Hello, world'

 Which of the three functions do you want call (1,2, 3 or 4)?
 2
 function_2 print 'Hello, world'
 function_2 print 'Hello, world'

 Which of the three functions do you want call (1,2, 3 or 4)?
 3
 function_3 print 'Hello, world'
 function_3 print 'Hello, world'

 Which of the three functions do you want call (1,2, 3 or 4)?
 4
 function_4 print 'Hello, world'
 function_4 print 'Hello, world'

非常确定这需要更多的上下文。发布的代码不需要基于该描述的符号吗?@dolan:你能解释一下SYS\u fork,SYS\u exit…..值是如何作为索引的吗?:-)@他们可能在法典的其他地方有定义。例如,作为枚举:
enum{SYS\u fork,SYS\u exit,…}。这将创建一组标识符,这些标识符作为常数(0,1,…)使用,您可以将其用作索引。也有可能它们被定义为宏。@dolan在你发布的链接中写道:“这方面的另一种语法自GCC 2.5以来已经过时,但GCC仍然接受,即在元素值之前写入
[index]
,没有
=
”@milleniumbug什么是过时的?机修工是自己做的还是带着
=
的?