省略号在数组初始化用C内核模块(Ellipsis in array initialization i

2019-08-08 05:18发布

我正在研究在GitHub上一些代码https://github.com/umlaeute/v4l2loopback/blob/master/v4l2loopback.c和跨越这条线,这令我感到困惑就来了。 这是一些令人难以置信的冷静内核宏或GCC的功能,我不知道? 什么是= -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 )

总之,这是怎么回事与数组初始化? 请问该语法工作?

Answer 1:

你找到的例子指定初始化 。 C99和C11不走很远的例子,但他们对这种行为的一些非常灵活的支持。 你的具体的例子(使用... )是一个GCC扩展。 从链接:

初始化一个范围内的元素为相同的值,写入[first ... last] = value 。 这是一个GNU扩展。 例如,

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

因此,这意味着你的例子是创建数组的大小MAX_DEVICES和阵列中的每个元素初始化为-1

作为参考,唯一的标准支持的行为是指定具体指标,而不是范围:

[常数表达式] =初始值

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

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

它初始化数组明确值的前五个和最后五个要素。 中间值(如果有的话)会是0



文章来源: Ellipsis in array initialization in C kernel module
标签: c kernel