[N ... M]在C聚合初始化器中的含义是什么?

Amu*_*umu 101 c linux kernel

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扩展.例如,

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
Run Code Online (Sandbox Code Playgroud)

它不便携.编译时-pedantic告诉你.

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

  • @Mehrdad微软c编译器是否符合c99标准?我在这里休息一下...... [c99](http://en.wikipedia.org/wiki/C99) (5认同)
  • @Mehrdad:实际上,只有指定初始化程序的基于范围的构造是gcc扩展.C标准允许指定的初始化程序本身. (3认同)
  • @Mehrdad:对不起,我不想成为任何火焰诱饵的一部分,我的意图只是澄清一个我认为你误解的微妙细节. (2认同)
  • @Mehrdad:要清楚,范围构造仅可移植到gcc(以及实现其扩展的编译器),并且通常指定的初始化器只能移植到支持C99(或至少是特定功能)的编译器. (2认同)