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

标签 c kernel

我正在检查 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 )

无论如何,数组初始化是怎么回事?该语法如何工作?

最佳答案

您找到了 designated initializers 的示例. C99 和 C11 并没有像您的示例那样走得那么远,但是它们对这种行为有一些非常灵活的支持。您的具体示例(使用 ...)是 GCC 扩展。来自链接:

To initialize a range of elements to the same value, write [first ... last] = value. This is a GNU extension. For example,

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

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

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

[constant-expression] = initializer-value

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

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

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

关于c - C 内核模块中数组初始化中的省略号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14513067/

相关文章:

windows - 记录系统调用

c - C中没有参数的函数

c - C中的回溯迷宫求解器

c - 如何查找 sscanf 输入程序集的格式

c++ - Raspberry PI 3 - 内核驱动程序 - 无法使用 ioremap() 访问 GPIO

linux - 自定义 ebtables 模块 && skb 操作 && 内核 panic

核心转储分析 gdb : print return address and arguments

c++ - 计算文件中每个字母的出现次数?

c - scanf() 无限运行,程序在一条语句上停止运行

assembly - Kernel.c 没有执行完整的代码 [OS from scratch]