使用C99进行C struct初始化 - 将命名和未命名成员混合有效吗?

Jos*_*itt 4 c c99 designated-initializer

鉴于以下内容:

struct example_struct
{
  char c;
  int i;
};
Run Code Online (Sandbox Code Playgroud)

以下初始化程序语法在C99中是否有效?

语法示例#1

struct example_struct example = { 'a', .i = 1};
Run Code Online (Sandbox Code Playgroud)

语法示例#2

struct example_struct example = { .c = 'a', 1};
Run Code Online (Sandbox Code Playgroud)

我正在编写一个简单的结构解析器,在我的测试中,这不会导致使用XCode 4.2的编译器错误.我希望我的解析器符合C99标准.我的理解(没有标准引用)是struct初始化程序应该具有所有未命名或命名(即指定)成员.

语法示例#1和#2应该是编译器错误吗?

如果示例有效,初始化语法的规则是什么?

更新的问题示例

struct example_struct_3
{
  char c;
  int i;
  float f;
};

struct example_struct_3 example = { .i = 1, 1.0};
Run Code Online (Sandbox Code Playgroud)

在同一个主要问题中,示例三如何工作?我主要对使用标准初始化器的指定初始化器的任意排序感到困惑.

oua*_*uah 7

初始化示例1和2都是有效的C99/C11初始化.您可以在初始化列表中混合指定初始值设定项和非指定初始值设定项.

编辑:关于您的新示例3,初始化也是有效的.初始化后,example.c具有值0,example.i有价值1example.f有价值(float) 1.0.