Ésta es la línea 519 de WinNT.h
(Build Versión: 0091)¿Qué significa esta línea del preprocesador C/C++?
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
¿Por qué necesitamos un puntero a una estructura con un solo miembro int con un nombre raro llamado unused
?
¿Y alguna vez tendremos que usar una línea de código como esta?
HINSTANCE hInstance = new HINSTANCE__;
En general declarar diferentes tipos de datos con las mismas estructuras, no tiene sentido para mí. ¿Cuál es la idea detrás de esto?
DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HRSRC);
DECLARE_HANDLE(HSPRITE);
DECLARE_HANDLE(HLSURF);
DECLARE_HANDLE(HSTR);
DECLARE_HANDLE(HTASK);
DECLARE_HANDLE(HWINSTA);
DECLARE_HANDLE(HKL);
Entonces, ¿la idea detrás de esto es tener tipos de datos enteros que no se utilizarán para fines distintos a los que fueron declarados? –
Sí, eso proporciona seguridad de tipo para los tipos de asa, por lo que se obtiene un error cuando se intenta pasar un HINSTANCE a una función que requiere un MANGO aunque la estructura subyacente sea idéntica. (Esta respuesta iba a ser simplemente "sí", pero evidentemente no era lo suficientemente detallada. Se agregó una verbosidad adicional) – janm
ahhh Veo por qué C no permite estructuras anónimas como parámetros para funciones ahora; si tratara las estructuras anónimas como iguales a cualquier estructura idéntica con la misma configuración, haría que C no cause errores para hacer que este truco funcione. Dicho esto, estoy bastante seguro de que permitirlo permitiría un código más flexible, pero al menos hay una razón. también parece indicar que existe una dependencia del código real de los punteros que son exactamente del tamaño de int, de lo contrario, el identificador se rompería y sería necesario volver a escribir mucho código. – Dmitry