[N…M]在C聚合初始化程序中是什么意思?


101

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]


2
不,它不是指向数组的指针,而是一个指针数组。将声明指向数组的指针void (*sys_call_table)[__NR_syscalls]
PatrickSchlüter2012年

@tristopia你是对的。我的意思是指向数组的指针,类似于char *argv[]。固定。
Amumu '04 -4-10

Answers:


90

使用指定的初始化程序进行初始化

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

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

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

它不是便携式的。编译与-pedantic告诉您。

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


看来这不是便携式的。伊斯兰国?
Ivaylo Strandjev '04年

5
@Mehrdad Microsoft C编译器符合c99标准吗?我在这里休息一下…… c99
Aftnix 2012年

3
@Mehrdad:实际上,只有基于范围的指定初始化程序构造是gcc扩展.C标准本身允许指定初始化程序本身。
Alok保存2012年

2
@Mehrdad:对不起,我不希望成为任何火焰诱饵的一部分,我的意图只是澄清一个细微的细节,我以为您误会了。
Alok保存

2
@Mehrdad:要清楚,范围构造仅可移植到gcc(以及实现其扩展的编译器),并且指定的初始化程序通常只可移植到支持C99(或至少该特定功能)的编译器。
基思·汤普森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.