Подтвердить что ты не робот

Инициализация структуры в С++

Код snippeed из Android AOSP , Sensor.cpp имеет код ниже.

struct sensors_module_t HAL_MODULE_INFO_SYM = {
    common: {
        tag: HARDWARE_MODULE_TAG,
        version_major: 1,
        version_minor: 0,
        id: SENSORS_HARDWARE_MODULE_ID,
        name: "LGE Sensor module",
        author: "LG Electronics Inc.",
        methods: &sensors_module_methods,
        dso: NULL,
        reserved: {0}
    },
    get_sensors_list: sensors__get_sensors_list,
};

Теперь я не понимаю здесь, что означает : здесь? Это какая-то инициализация или что-то еще?

Я не знаю много о С++. поэтому, если какая-либо ссылка или ресурс, чтобы понять это, будут оценены. Я не смог найти многого для поиска по этой теме.

4b9b3361

Ответ 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, который совместим с ним.