2010-08-31 14 views
18

con C++ y algunas cosas Winapi, me encontré con este individuo:no puede dar sentido a LARGE_INTEGER estructura

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

Por lo tanto, la forma en que lo veo, dependiendo de MIDL_PASS se establece o no, esto es o bien una estructura muy compacta con solo un LONGLONG en ella, o el caso mucho más interesante, esto se convierte en una unión.

En caso de que se trate de una unión, todavía tiene sentido para mí, tener dos posibilidades de acceso, una vez el LONGLONG en un solo trozo, y una vez la estructura con Low y Highpart. Hasta ahora todo bien.

Pero no puedo entender el hecho de que la estructura se declara dos veces, de forma idéntica. Parece que ambos son anónimos, pero el último está disponible a través de "u".

Ahora a mi pregunta: ¿

¿Por qué las dos estructuras definidas, ¿cuál es el propósito de la primera, si ni siquiera puedo acceder a él, debido a no estar atado a ningún tipo/variable (de forma redundante?) nombre.

Respuesta

18

Microsoft proporciona estructuras anónimas como extension (el ejemplo muestra una estructura dentro de otra estructura, sino una struct en una unión es similar). Si no te importa no portátil de código en función de su extensión, puede usar cosas como:

LARGE_INTEGER a; 
a.LowPart = 1; 

pero si quieres código portable, es necesario:

a.u.LowPart = 1; 

La unión le permite utilizar ya sea.

+0

bien, ahora eso tiene mucho sentido, gracias: D – Tom

+0

La gente debería seguir los estándares. Microsoft es el estándar. Y el círculo está completo. –

2

Puede acceder directamente al LowPart y HighPart sin tener que pasar por el miembro u. Como:

LARGE_INTEGER x; 
x.HighPart = 42; 

(Necesidad de mirar hacia arriba, aunque si no identificadas estructuras pueden ser miembros del sindicato en la Norma C)

+1

Genial, pero ¿por qué molestarse en tener esta redundancia en absoluto? Realmente no entiendo por qué esta estructura casi idéntica está allí dos veces. – Tom

+1

Para hacerlo portátil. – dirkgently

+0

Gracias, eso explica mucho;) – Tom

Cuestiones relacionadas