2010-08-31 12 views
18

用C++和一些WINAPI東西的感覺,我遇到這個傢伙:不能讓LARGE_INTEGER結構

#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」獲得。

現在我的問題:

爲什麼定義的兩個結構,什麼是第一位的目的,如果我甚至無法訪問它,由於沒有被綁定到任何類型/變量(冗餘?)名稱。

回答

18

Microsoft提供匿名結構作爲extension(他們的例子顯示了另一種結構中一個結構,但結構在一個聯合是相似的)。如果基於其擴展名不介意不可移植的代碼,你可以使用之類的東西:

LARGE_INTEGER a; 
a.LowPart = 1; 

但如果你想移植的代碼,你需要:

a.u.LowPart = 1; 

工會讓你使用無論是。

+0

好吧,現在,這使得很多道理,謝謝:D – Tom 2010-08-31 07:47:07

+0

人們應該遵循標準。微軟是標準。圓圈是完整的。 – 2014-05-07 21:45:04

2

您可以直接訪問LowPartHighPart,而不必通過u成員。正如:

LARGE_INTEGER x; 
x.HighPart = 42; 

(需儘管查找無名是否能結構是標準C.工會成員)

+1

很酷,但爲什麼麻煩有這個冗餘呢?我沒有真正理解爲什麼這個幾乎相同的結構有兩次。 – Tom 2010-08-31 07:40:59

+1

爲了便於攜帶。 – dirkgently 2010-08-31 07:44:28

+0

謝謝,這解釋了很多;) – Tom 2010-11-09 12:33:38