如果使用常规初始化列表,则按顺序分配元素的值,因此如果您具有此结构:
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省略了初始化,尽管它是结构中的第一个值.
试试这个链接。
这个想法是能够在初始化期间引用复杂类型(如结构)的成员。例如
struct s {
int a, b;
};
int main() {
struct s = { .b = 42, .a = -42 };
return 0;
}
Run Code Online (Sandbox Code Playgroud)
灵活性是通过指定值时与顺序无关而获得的。请记住,这是添加到 C99 标准中的,不完全支持 C99(或支持早期版本的标准)的编译器可能不支持它。