从sys.c第123行:
void *sys_call_table[__NR_syscalls] =
{
[0 ... __NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};
Run Code Online (Sandbox Code Playgroud)
sys_call_table
是一个指向数组的通用指针,我可以看到.但是符号是什么:
[0 ... __NR_syscalls-1]
Run Code Online (Sandbox Code Playgroud)
什么是...
?
编辑:
我在这里学到了另一个C技巧:#include <asm/unistd.h>
将被预处理并替换为其内容并分配给[0 ... _NR_syscalls-1]
.
Alo*_*ave 90
它是使用指定初始化器初始化.
基于范围的初始化是gnu gcc扩展.
要将一系列元素初始化为相同的值,请写入
[first ... last] = value
.这是一个GNU扩展.例如,Run Code Online (Sandbox Code Playgroud)int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
它不便携.编译时-pedantic
告诉你.
它在这里如何运作?
预处理器在基于范围的构造中替换#include <asm/unistd.h>
其实际内容(它定义了各种符号常量和类型,并声明其他函数),然后进一步用于初始化指针数组.