Аргумент функции анонимная структура - PullRequest
0 голосов
/ 05 сентября 2018


Многие из нас знают, что это работает:

struct data_s
{
    uint32_t p_1;
    uint32_t p_2;
    uint32_t p_3;
    uint32_t p_4;
};

void foo(struct data_s data)
{
    printf("p1: %d\r\n", data.p_1);
    printf("p2: %d\r\n", data.p_2);
    printf("p3: %d\r\n", data.p_3);
    printf("p4: %d\r\n", data.p_4);
}

int main(void)
{
    foo((struct data_s){
            .p_1 = 1,
            .p_2 = 2,
            .p_3 = 3,
            .p_4 = 4});
}

Я видел это много раз, но сейчас не могу найти ничего в справочном руководстве по С об этом. Определен ли этот стандарт конструкции или реализация?

Кроме того, приведение типов является довольно странным, потому что это больше похоже на то, что «я расскажу компилятору, как и что выделять и как его расположить», чем «приведение этого типа к этому типу». Будет ли расположение данных в памяти аргумента, переданного функции, точно таким же, как у объекта, созданного struct data_s obj;?

1 Ответ

0 голосов
/ 05 сентября 2018

Это составной литерал .

Я был представлен в C99, и нет никакой разницы между ним и другими константами и литералами.

Из Интернета:

Составное литеральное выражение создает безымянный объект тип определяется типом и инициализирует его как указано инициализатора-лист.

Тип составного литерала - тип (кроме случаев, когда тип - массив неизвестного размера; его размер выводится из списка инициализаторов как в инициализация массива).

Категория значения составного литерала - lvalue (его адрес может быть принято).

Безымянный объект, для которого вычисляется составной литерал, имеет статический продолжительность хранения, если составной литерал встречается в области видимости файла и длительность автоматического хранения, если составной литерал встречается в блоке область действия (в этом случае время жизни объекта заканчивается в конце ограждающий блок).

...