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