Ответ 1
Это расширение для компилятора, устаревшая форма назначенного инициализатора. Реализация gcc документирована здесь.
В C вы можете:
struct point { int x, y; };
struct point p = { 10, 20 };
С назначенной функцией инициализации, введенной в ISO C99, вы можете записать это как:
struct point { int x, y; };
struct point p = { .x = 10, .y = 20 };
Но до C99 gcc ввел аналогичную функцию с другим синтаксисом:
struct point { int x, y; };
struct point p = { x: 10, y: 20 };
gcc, а точнее g++, поддерживает это также в режиме С++, но С++ не использовал инициализаторы, обозначенные в стиле C99.
В руководстве gcc говорится, что версия этой функции :
устарела, поскольку gcc 2.5, выпущенный в 1993 году, поэтому определенно не должен использоваться в новом коде.
Обратите внимание, что если начальное значение является небольшой целочисленной константой, как в вашем примере:
version_major: 1,
version_minor: 0,
его легко путать с синтаксисом для полей бит.
Для C форма .name = value
действительна и переносима, если ваш компилятор поддерживает C99 или более позднюю версию. Для С++ он не переносится, но вы можете использовать синтаксис C99, пока вы используете g++ или компилятор, подобный clang, который совместим с ним.