Как работают подобъекты в C?

Что означает автономные квадратные скобки внутри массива C пользовательского типа?

typedef enum {
    BAR_1 = 0,
    BAR_2,
    BAR_3,
} bar_types;

typedef struct {
    int is_interesting;
    int age;
} foo_s;

static foo_s bars[] = {
    [BAR_1] = {1, 2},  /* What is being done here? */
    [BAR_2] = {1, 41},
    [BAR_3] = {0, 33},
};

В приведенном выше коде, что означает [BAR_1] = {1, 2}? Когда можно использовать отдельные квадратные скобки?

Я заметил, что если я добавлю повторяющееся значение в скобках, clang выдаст предупреждение об инициализации подобъекта.

static foo_s bars[] = {
    [BAR_1] = {1, 2},
    [BAR_2] = {1, 41},
    [BAR_3] = {0, 33},
    [BAR_3] = {0, 33},
};

-----

$clang example.c
example.c:17:19: warning: subobject initialization 
  overrides initialization of other fields within its
  enclosing subobject [-Winitializer-overrides]
    [BAR_3] = {0, 33},
              ^~~~~~~

Что такое подобъект C?

1 ответ

Это инициализация структуры, "подобъект" - это экземпляр структуры, которая инициализируется.

Ваше предупреждение исходит от попытки инициализировать одну и ту же позицию массива дважды.

также см. Как инициализировать структуру в соответствии со стандартами языка программирования C

Другие вопросы по тегам