1

我正在查看一些包含这种结构定义的代码。起初,我认为这是一种定义结构的特殊方式,它定义了它并同时实例化了一个结构。然而,在我自己测试了一些类似的代码之后,我对这种类型的代码行为方式的预测是错误的。有人能告诉我这段代码的作用/我可以在哪里在线查看此类代码的描述吗?

struct Error e = { .code = 22,
                   .msg = 22100 };
4

3 回答 3

7

这不是结构定义,而是指定的初始化程序。它将code字段设置为22并将msg字段设置为22100。从逻辑上讲,您可以将其重写为:

struct Error e = {0};
e.code = 22;
e.msg = 22100;

您可以对数组执行类似的操作:

int a[5] = {
  [3] = 12,
  [4] = 17
};
于 2013-07-03T17:56:22.250 回答
4

这是一个 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

“尽管它出现在索引和新功能部分(标准在文本中使用术语“指定初始化器”),但标准中从未提及过“指定初始化器”一词。

于 2013-07-03T17:56:40.590 回答
1

这称为指定初始化程序,它正在初始化结构的实例。

这是 GCC 关于如何使用它们的手册页

于 2013-07-03T17:57:45.470 回答