-Wmissing-field-initializer при использовании назначенных инициализаторов

Я использую GCC 4.6.2 (Mingw) и компилирую с помощью -Wextra. Я получаю странные предупреждения всякий раз, когда использую назначенные инициализаторы. Для следующего кода

typedef struct
{
  int x;
  int y;
} struct1;

typedef struct
{
  int x;
  int y;
} struct2;

typedef struct
{
  struct1 s1;
  struct2 s2[4];

} bug_struct;

bug_struct bug_struct1 =
{
  .s1.x = 1,
  .s1.y = 2,

  .s2[0].x = 1,
  .s2[0].y = 2,

  .s2[1].x = 1,
  .s2[1].y = 2,

  .s2[2].x = 1,
  .s2[2].y = 2,

  .s2[3].x = 1,
  .s2[3].y = 2,
};

я получаю предупреждения

bug.c:24:3: warning: missing initializer [-Wmissing-field-initializers]
bug.c:24:3: warning: (near initialization for 'bug_struct1.s1.y') [-Wmissing-field-initializers]

Так чего именно не хватает? Я инициализировал каждого члена. Является ли это предупреждение слишком грубым для работы с назначенными инициализаторами, я делаю что-то не так или это ошибка компилятора?


person Lundin    schedule 05.03.2014    source источник


Ответы (1)


Кажется, что предупреждение, как вы говорите, "слишком резкое".

Этот шаблон доступа, инициализирующий каждую структуру-член как единое целое, удовлетворяет компилятор:

bug_struct bug_struct1 =
{
    .s1 = {.x = 1, .y = 2},
    .s2[0] = {.x = 1, .y = 2},
    .s2[1] = {.x = 1, .y = 2},
    .s2[2] = {.x = 1, .y = 2},
    .s2[3] = {.x = 1, .y = 2}
};
person Henrik    schedule 05.03.2014
comment
Да, очевидно, предупреждение не может работать без фигурных скобок. - person Lundin; 05.03.2014