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

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

С С++ и некоторыми вещами 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".

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

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

4b9b3361

Ответ 1

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

LARGE_INTEGER a;
a.LowPart = 1;

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

a.u.LowPart = 1;

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

Ответ 2

Вы можете получить доступ к LowPart и HighPart без необходимости проходить через элемент u. В:

LARGE_INTEGER x;
x.HighPart = 42;

(нужно искать, хотя если неназванные структуры могут быть членами объединения в стандарте C.)