我在linux内核中发现了一些奇怪的代码,有人可以向我解释一下吗?

时间:2010-02-11 00:35:39

标签: c linux-kernel

我在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,
};

源代码(第366行):initramfs.c

3 个答案:

答案 0 :(得分:22)

这是索引的无序数组初始化。这就像写作

actions[Start] = do_start;
actions[Collect] = do_collect;

除了您可以将其作为静态初始化程序。

答案 1 :(得分:18)

这是ISO C99的一项称为designated initializers的功能。它创建一个数组并初始化该数组的特定元素,不一定是前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;

除了数组只有它需要的大小(大小等于最大索引的大小),并且它可以在全局范围内静态初始化 - 你不能在全局运行上面的代码范围。

这不是ANSI C89的功能,但即使将代码编译为C89,GCC也将此功能作为扩展提供。

答案 2 :(得分:3)

数组初始化中的

指示符

括号中的表达式称为指示符,这是通过命名字段或元素来初始化数组或结构的语法,而不仅仅是通过按与声明相同的顺序对初始化程序进行排序。