C内核模块中数组初始化中的省略号

我正在检查github上的一些代码https://github.com/umlaeute/v4l2loopback/blob/master/v4l2loopback.c并遇到了这一行,令我感到困惑。 这是一些我不知道的非常酷的内核宏或gccfunction吗? = -1做什么?

 static int video_nr[MAX_DEVICES] = { [0 ... (MAX_DEVICES-1)] = -1 }; module_param_array(video_nr, int, NULL, 0444); MODULE_PARM_DESC(video_nr, "video device numbers (-1=auto, 0=/dev/video0, etc.)"); 

有问题的行是第一个,后两个用于上下文(这是使用内核宏创建cmdline可指定的参数http://lxr.free-electrons.com/source/include/linux/moduleparam.h#L103 )

无论如何,数组初始化发生了什么? 该语法如何工作?

您已经找到了指定初始值设定项的示例。 C99和C11并没有达到你的例子,但他们对这种行为有一些非常灵活的支持。 您的具体示例(使用... )是GCC扩展。 从链接:

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

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

这意味着您的示例是创建一个大小为MAX_DEVICES的数组, MAX_DEVICES该数组中的每个元素初始化为-1

作为参考,唯一标准支持的行为是分配特定索引,而不是范围:

[constant-expression] =初始值 – 值

我的规范副本中有一个更复杂的例子:

 int a[MAX] = { 1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0 }; 

其中将数组的前五个和后五个元素初始化为显式值。 中间值(如果有)将为0

include / linux / cpumask.h中也是如此

 #define CPU_BITS_NONE \ { \ [0 ... BITS_TO_LONGS(NR_CPUS)-1] = 0UL \ }