2010-08-31 3 views
18

Con C++ e alcune cose WinAPI, ho incontrato questo ragazzo:non può dare un senso a LARGE_INTEGER struct

#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; 

Quindi, il mio modo di vedere, a seconda MIDL_PASS stato impostato o no, questa è o un struttura molto compatta con solo un LONGLONG in esso, o il caso molto più interessante, questo diventa un sindacato.

Nel caso in cui questo è un sindacato, ha ancora senso per me avere due possibilità di accesso, una volta LONGLONG in un blocco, e una volta la struttura con Basso e Alto. Fin qui tutto bene.

Ma non ho alcun senso dal fatto che la struttura sia dichiarata due volte, identicamente. Sembra che siano entrambi anonimi, ma quest'ultimo è disponibile tramite "u".

Ora alla mia domanda:

Perché sono le due le strutture definite, qual è lo scopo del primo, se non riesco nemmeno accedervi, a causa di non essere legato ad alcun tipo/variabili (ridondante?) nome.

risposta

18

Microsoft fornisce le strutture anonime come extension (il loro esempio mostra una struct all'interno di un'altra struct, ma un struct in a union è simile). Se non ti dispiace non portabile il codice in base alla loro estensione, è possibile utilizzare le cose come:

LARGE_INTEGER a; 
a.LowPart = 1; 

ma se si vuole codice portabile, è necessario scaricare:

a.u.LowPart = 1; 

L'unione consente di utilizzare o.

+0

ok, ora che ha molto senso, grazie: D – Tom

+0

Le persone dovrebbero seguire gli standard. Microsoft è lo standard. E il cerchio è completo. –

2

È possibile accedere direttamente a LowPart e HighPart senza passare per il membro u. Come:

LARGE_INTEGER x; 
x.HighPart = 42; 

(Necessità di guardare in alto ma se le strutture anonime possono essere iscritti al sindacato in standard C.)

+1

Cool, ma allora perché preoccuparsi di avere questa ridondanza? Non capisco davvero perché questa struttura quasi identica ci sia due volte. – Tom

+1

Per renderlo portatile. – dirkgently

+0

Grazie, questo spiega molto;) – Tom