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