Не может понять структуру 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".
Теперь на мой вопрос:
Почему две структуры определены (избыточно?), какова цель первой, если я даже не могу ее получить, из-за того, что она не привязана к имени типа/переменной.
Ответы
Ответ 1
Microsoft предоставляет анонимные структуры как расширение (их пример показывает одну структуру внутри другой структуры, но структура в объединении похожа). Если вы не возражаете против портативного кода, основанного на их расширении, вы можете использовать такие вещи, как:
LARGE_INTEGER a;
a.LowPart = 1;
но если вам нужен переносимый код, вам нужно:
a.u.LowPart = 1;
Объединение позволяет использовать либо.
Ответ 2
Вы можете получить доступ к LowPart
и HighPart
без необходимости проходить через элемент u
. В:
LARGE_INTEGER x;
x.HighPart = 42;
(нужно искать, хотя если неназванные структуры могут быть членами объединения в стандарте C.)