Может кто-нибудь, пожалуйста, точно, почему были определены следующие typedef
s/#define
? Какое значение у них есть, по сравнению с оригиналами?
typedef char CHAR;
#define CONST const
typedef float FLOAT;
typedef unsigned __int64 DWORD64; //A 64-bit "double"-word?!
typedef ULONGLONG DWORDLONG; //What the difference?
typedef ULONG_PTR DWORD_PTR; //What 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?
И, лучше всего:
#define VOID void //Assuming this is useful (?), why not typedef?
Каковы причины этого? Это какая-то абстракция, которую я не понимаю?
Edit
Для тех людей, которые упоминают кросс-совместимость компилятора:
Мой вопрос не в том, почему они не использовали unsigned long long
вместо, скажем, DWORD64
. Мой вопрос в том, почему кто-нибудь использовал DWORD64
вместо ULONG64
(или наоборот)? Разве обе эти typedef
ed не должны быть 64 бита?
Или, как еще один пример: даже в "гипотетическом" компиляторе, который должен был обмануть нас во всех отношениях, какая разница между ULONG_PTR
и UINT_PTR
и DWORD_PTR
? Разве эти абстрактные типы данных не означают одно и то же - SIZE_T
?
Однако я спрашиваю, почему они использовали ULONGLONG
вместо long long
- существует ли какая-либо потенциальная разница в значении, не покрытая ни long long
, ни DWORDLONG
?