Да, как указывалось выше, это назначенные инициализаторы, которые являются стандартными C, хотя вы должны перейти на использование точек вместо двоеточий. И, как вы заметили, большинство книг там по-прежнему застряли где-то в 1984 году в их синтаксисе и не упоминают их. Более интересные факты:
- При использовании назначенных инициализаторов все, что не указано, инициализируется нулем. Это помогает с исключительно большими структурами, например:
typedef struct {
double a, b, c, d, e;
char label[100];
} too_many_type;
too_many_type tm = {.a = 1, .e = 2, .b=1.5};
assert(tm.a + tm.b + tm.c + tm.d + tm.e == 4.5);
assert(!strlen(label));
- Кроме того, вы можете использовать составную литеральную форму, чтобы использовать эту форму в строке без инициализации, например ::
too_many_type tm2;
tm2 = (too_many_type) {.a = 3, .e=6};
Это действительно замечательные возможности, которые поддерживаются каждым компилятором C, о котором я могу думать, так как он является стандартом. Обидно, что они не так известны.