指定的初始化器和省略的元素

maw*_*wia 5 c

任何人都可以解释有关指定初始化器的以下内容:

初始化列表可以省略在聚合中的任何位置声明的元素,而不是仅在末尾.

Pet*_*ham 9

如果使用常规初始化列表,则按顺序分配元素的值,因此如果您具有此结构:

typedef struct _foo {
  int a;
  int b;
} foo_t;
Run Code Online (Sandbox Code Playgroud)

然后这个初始化者明确指定a而不是b:

foo_t value = { 7 };
Run Code Online (Sandbox Code Playgroud)

没有指定的初始化器,唯一可以省略的元素是最后声明的元素

使用指定的初始化程序,您可以省略在任何地方声明的元素:

foo_t value = { .b = 8 };
Run Code Online (Sandbox Code Playgroud)

所以value.a省略了初始化,尽管它是结构中的第一个值.


dir*_*tly 1

试试这个链接

这个想法是能够在初始化期间引用复杂类型(如结构)的成员。例如

struct s {
   int a, b;
};

int main() {
  struct s = { .b = 42, .a = -42 };
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

灵活性是通过指定值时与顺序无关而获得的。请记住,这是添加到 C99 标准中的,不完全支持 C99(或支持早期版本的标准)的编译器可能不支持它。