не может иметь смысл структуры LARGE_INTEGER - PullRequest
20 голосов
/ 31 августа 2010

С 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 или нет, это либо очень компактная структура с толькоДОЛГОСРОЧНО в этом, или в гораздо более интересном случае, это становится объединением.

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

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

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

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

Ответы [ 2 ]

21 голосов
/ 31 августа 2010

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

LARGE_INTEGER a;
a.LowPart = 1;

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

a.u.LowPart = 1;

Союз позволяет вам использовать либо.

2 голосов
/ 31 августа 2010

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

LARGE_INTEGER x;
x.HighPart = 42;

(Нужно посмотреть, если неназванные структуры могут быть членами профсоюза в стандарте C.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...