我正在查看一些包含这种结构定义的代码。起初,我认为这是一种定义结构的特殊方式,它定义了它并同时实例化了一个结构。然而,在我自己测试了一些类似的代码之后,我对这种类型的代码行为方式的预测是错误的。有人能告诉我这段代码的作用/我可以在哪里在线查看此类代码的描述吗?
struct Error e = { .code = 22,
.msg = 22100 };
这不是结构定义,而是指定的初始化程序。它将code
字段设置为22
并将msg
字段设置为22100
。从逻辑上讲,您可以将其重写为:
struct Error e = {0};
e.code = 22;
e.msg = 22100;
您可以对数组执行类似的操作:
int a[5] = {
[3] = 12,
[4] = 17
};
这是一个 C99指定初始化程序。
指定初始值设定项允许您以任何顺序初始化聚合成员,并且它们还允许您省略成员。未明确指定的成员被初始化为0
。
例如a
这里的初始化:
struct bla {int x; int y; int z;};
struct bla a = {.x =1, .z = 1};
相当于下面的 C89 初始化:
struct bla a = {1, 0, 1};
关于术语的注释,它是指定初始化程序,而不是指定初始化程序。请参阅缺陷报告DR#253:
“尽管它出现在索引和新功能部分(标准在文本中使用术语“指定初始化器”),但标准中从未提及过“指定初始化器”一词。
这称为指定初始化程序,它正在初始化结构的实例。