не может понять структуру LARGE_INTEGER

С C ++ и некоторыми вещами в Winapi я встретил этого парня:

#if defined(MIDL_PASS)
typedef struct _LARGE_INTEGER {
#else // MIDL_PASS
typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    };
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;

Итак, как я вижу, в зависимости от того, установлен MIDL_PASS или нет, это либо очень компактная структура, в которой только LONGLONG или в гораздо более интересном случае это становится объединением.

В случае, если это объединение, для меня все еще имеет смысл иметь два варианта доступа, один раз LONGLONG в одном чанке, и один раз структура с Low и Highpart. Пока все хорошо.

Но я не могу иметь никакого смысла из того факта, что структура объявлена ​​дважды, идентично. Кажется, что они оба анонимны, но последний доступен через «u».

Теперь на мой вопрос:

Почему две структуры определены (избыточно?), Какова цель первой, если Я даже не могу получить к нему доступ, потому что не привязан ни к какому типу / имени переменной.

21
задан Cœur 13 January 2018 в 13:29
поделиться

1 ответ

Microsoft предоставляет анонимные структуры как расширение (их пример показывает одну структуру внутри другой структуры, но структура в объединении аналогична). Если вы не возражаете против непереносимого кода, основанного на его расширении, вы можете использовать такие вещи, как:

LARGE_INTEGER a;
a.LowPart = 1;

, но если вы хотите переносимый код, вам нужно:

a.u.LowPart = 1;

Объединение позволяет использовать и то, и другое.

21
ответ дан 29 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: