102

sys.c第 123 行:

void *sys_call_table[__NR_syscalls] = 
{
    [0 ... __NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};

sys_call_table是指向数组的通用指针,我可以看到。但是符号是什么:

[0 ... __NR_syscalls-1]

是什么...


编辑:
我在这里学到了另一个 C 技巧:#include <asm/unistd.h>将被预处理并替换为其内容并分配给[0 ... _NR_syscalls-1].

4

1 回答 1

91

它是使用Designated Initializers进行的初始化。

基于范围的初始化是一个 gnu gcc 扩展。

要将一系列元素初始化为相同的值,请编写[first ... last] = value. 这是一个 GNU 扩展。例如,

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

它不是便携式的。用 with 编译-pedantic告诉你。

它是如何在这里工作的?
预处理器在基于范围的构造中替换#include <asm/unistd.h>为它的实际内容(它定义了各种符号常量和类型,并声明了各种函数),然后进一步用于初始化指针数组。

于 2012-04-09T09:30:20.767 回答