【发布时间】:2009-04-18 16:52:17
【问题描述】:
谁能解释一下关于指定初始化器的以下行:
初始化列表可以省略在聚合中任何地方声明的元素,而不仅仅是在末尾。
【问题讨论】:
标签: c
谁能解释一下关于指定初始化器的以下行:
初始化列表可以省略在聚合中任何地方声明的元素,而不仅仅是在末尾。
【问题讨论】:
标签: c
如果你使用传统的初始化列表,元素的值是按顺序分配的,所以如果你有这个结构:
typedef struct _foo {
int a;
int b;
} foo_t;
然后这个初始化器显式分配a而不是b:
foo_t value = { 7 };
没有指定的初始化器,唯一可以省略的元素是在末尾声明的元素
使用指定的初始化器,您可以省略在任何地方声明的元素:
foo_t value = { .b = 8 };
所以value.a 的初始化器被省略了,尽管它是结构中的第一个值。
【讨论】:
试试这个link。
这个想法是能够在初始化期间引用复杂类型的成员,例如结构。例如
struct s {
int a, b;
};
int main() {
struct s = { .b = 42, .a = -42 };
return 0;
}
在指定值时与顺序无关,从而获得了灵活性。请记住,这是添加到 C99 标准中的,并且可能不受不完全支持 C99(或不支持该标准的早期版本)的编译器支持。
【讨论】: