¿Podría alguien decir exactamente por qué se han definido los siguientes typedef
s/#define
s? ¿Qué valor tienen, en comparación con los originales?Tipos de datos de Windows ... ¿por qué tan redundante/indescriptible?
typedef char CHAR;
#define CONST const
typedef float FLOAT;
typedef unsigned __int64 DWORD64; //A 64-bit "double"-word?!
typedef ULONGLONG DWORDLONG; //What's the difference?
typedef ULONG_PTR DWORD_PTR; //What's the difference?
typedef long LONG_PTR; //Wasn't INT_PTR enough?
typedef signed int LONG32; //Why not "signed long"?
typedef unsigned int UINT; //Wait.. UINT is "int", "LONG" is also int?
typedef unsigned long ULONG; //ULONG is "long", but LONG32 is "int"? what?
typedef void *PVOID; //Why not just say void*?
typedef void *LPVOID; //What?!
typedef ULONG_PTR SIZE_T; //Why not just size_t?
Y, lo mejor de todo:
#define VOID void //Assuming this is useful (?), why not typedef?
¿Cuál es el razonamiento detrás de estos? ¿Es algún tipo de abstracción que no entiendo?
Editar:
Para aquellas personas que citan compilador cruzado-compatilibity:
Mi pregunta es no acerca de por qué no utilizaron unsigned long long
en lugar de, digamos, DWORD64
. Mi pregunta es por qué alguien usaría DWORD64
en lugar de ULONG64
(o viceversa)? ¿No están ambos de esos typedef
ed ser de 64 bits de ancho?
O, como otro ejemplo: Incluso en un compilador "hipotético" que estaba destinado a engañarnos en todos los aspectos, ¿cuál sería la diferencia entre ULONG_PTR
y UINT_PTR
y DWORD_PTR
? ¿No son esos todos los tipos de datos abstractos que significan lo mismo - SIZE_T
?
Sin embargo, yo soy preguntando por qué se utilizan en lugar de ULONGLONG
long long
- ¿hay alguna diferencia de potencial en el significado, ni cubierto por long long
ni DWORDLONG
?
Sospecho que muchos de estos harken de las edades oscuras de win16, pero voy a dejar que aquellos que realmente escribieron código de Windows en las edades de antaño respondan :) – bdonlan
@bdonlan: Haha bien. :) – Mehrdad
Hay muchas cosas que influyen en la historia de estos tipos. Cuando una vez definido, nunca puede recuperarlo. #define VOID void se realizó porque originalmente void * originalmente no estaba en el estándar C (no se puede encontrar un enlace ...). Entonces algunos compiladores no lo reconocieron. Pero si lo quitas ahora, rompes el código. Y nadie quiere romper su código cuando actualiza el SDK. Ya hay demasiados problemas al actualizar, ¿por qué romper esto en algún módulo anterior que no se tocó durante "siglos" pero ahora de repente ya no se compila? – Christopher