我在initramfs.c中发现了这个,我之前没有看过这个语法,有人可以解释它在做什么吗?
static __initdata int (*actions[])(void) = {
[Start] = do_start,
[Collect] = do_collect,
[GotHeader] = do_header,
[SkipIt] = do_skip,
[GotName] = do_name,
[CopyFile] = do_copy,
[GotSymlink] = do_symlink,
[Reset] = do_reset,
};
Run Code Online (Sandbox Code Playgroud)
源代码(第366行):initramfs.c
Var*_*der 22
这是索引的无序数组初始化.这就像写作
actions[Start] = do_start;
actions[Collect] = do_collect;
Run Code Online (Sandbox Code Playgroud)
除了你可以作为静态初始化器.
Ada*_*eld 18
这是ISO C99的一项称为指定初始化程序的功能.它创建一个数组并初始化该数组的特定元素,不一定是前N个.它等同于以下代码段:
static __initdata int (*actions[SOME_SIZE])(void);
actions[Start] = do_start;
actions[Collect] = do_collect;
actions[GotHeader] = do_header;
actions[SkipIt] = do_skip;
actions[GotName] = do_name;
actions[CopyFile] = do_copy;
actions[GotSymlink] = do_symlink;
actions[Reset] = do_reset;
Run Code Online (Sandbox Code Playgroud)
除了数组只需要它所需的大小(大小等于最大索引的大小),并且它可以在全局范围内静态初始化 - 您无法在全局范围内运行上述代码.
这不是ANSI C89的功能,但即使将代码编译为C89,GCC也将此功能作为扩展提供.