Qualcuno potrebbe per piacere esattamente perché sono stati definiti i seguenti typedef
s/#define
s? Che valore hanno, rispetto agli originali?Tipi di dati di Windows ... perché così ridondanti/non descrittivi?
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?
E, meglio di tutti:
#define VOID void //Assuming this is useful (?), why not typedef?
Qual è il ragionamento che sta dietro questi? È una specie di astrazione che non capisco?
Edit:
Per quelle persone che citano il compilatore cross-compatilibity:
La mia domanda non è sul perché non hanno usato unsigned long long
invece di, diciamo, DWORD64
. La mia domanda riguarda il motivo per cui qualcuno dovrebbe utilizzare DWORD64
anziché ULONG64
(o viceversa)? Non sono entrambi quelli typedef
ed hanno una larghezza di 64 bit?
Oppure, come un altro esempio: Anche in un compilatore "ipotetico" che doveva ingannarci a tutti gli effetti, quale sarebbe la differenza tra ULONG_PTR
e UINT_PTR
e DWORD_PTR
? Non tutti questi tipi di dati astratti significano solo la stessa cosa - SIZE_T
?
Tuttavia, io sono chiedendo perché hanno usato ULONGLONG
invece di long long
- v'è alcuna differenza di potenziale di significato, né coperto da long long
nè DWORDLONG
?
Sospetterei molto di questi harken dai tempi bui di win16, ma lo lascerò a quelli che in realtà hanno scritto il codice di Windows nei secoli del passato per rispondere :) – bdonlan
@bdonlan: Haha okay. :) – Mehrdad
Ci sono molte cose che influenzano la storia di questi tipi. Una volta definito, non puoi mai riprenderlo. #define Void vuoto è stato fatto, perché originariamente void * non era originariamente nello standard C (non riesce a trovare un collegamento ...). Quindi alcuni compilatori non l'hanno riconosciuto. Ma se lo rimuovi ora, rompi il codice. E nessuno vuole che il suo codice si rompa, quando aggiorna l'SDK. Ci sono già troppi problemi durante l'aggiornamento, perché interromperlo in qualche vecchio modulo che non è stato toccato per "secoli", ma ora improvvisamente non viene più compilato. – Christopher