Un sacco di typedef in windows.h

1

Sono nuovo alla programmazione in ambiente Windows. La lingua che uso è C. Più in particolare, provo a manipolare le porte COM su Windows manualmente (senza librerie speciali, solo le funzioni WinAPI).

La mia domanda riguarda la presenza di molti typedef in windows.h. Che scopo servono?

È OK mescolare bool, BOOL, unsigned int e WORD, ad esempio, in un file sorgente (dal punto di vista dello stile di codifica o dell'efficacia), o ho bisogno di un qualche tipo di standardizzazione (usa BOOL invece di bool ovunque e così via)?

L'esempio tipico di funzione con diversi tipi di parametri nel mio codice è questo:

bool ConfigureDCB(  HANDLE  hp_ComPort,
                    bool    bUseCurrentSettings,
                    DWORD   dwBaudRate,
                    BOOL    bParityCheck,
                    BYTE    byteSize,
                    BYTE    parityMode,
                    BYTE    stopBits    )

Ci sono entrambi i tipi BOOL e bool tra i parametri di funzione. Il primo viene utilizzato esattamente come prescritto nel file di intestazione (il suo valore viene impostato direttamente su un membro BOOL della struttura) e il secondo (e anche il tipo di ritorno della funzione) viene utilizzato solo come parte della logica del programma:

if(!bUseCurrentSettings)
{
    ...
}
    
posta StaticZero 22.10.2016 - 01:55
fonte

2 risposte

3

Le intestazioni di Windows utilizzano BOOL, BYTE, WORD, DWORD ecc. per motivi storici.

WORD è stato definito quando i computer utilizzavano parole a 16 bit. Oggigiorno le "parole" sono spesso a 64 bit, ma nessuno usa più il termine "parole". Quindi quando vedi un tipo WORD, sai "aha, questo è Windows, e significa uint16_t". Lo stesso con DWORD, che era una doppia parola (32 bit) quando i computer utilizzavano parole di 16 bit; al giorno d'oggi la lettura di "DWORD" significa "Windows, uint32_t". BYTE è fondamentalmente un sinonimo di "uint8_t".

HANDLE è un tipo astratto. BOOL è leggermente pericoloso: è non uguale a bool. È quasi la stessa cosa, ma non è esattamente la stessa cosa. Non farei alcuna scommessa che BOOL e bool usino lo stesso numero di bit, per esempio.

Dipende da te, davvero. Personalmente, penso che un utente della tua funzione debba confrontarsi con le stranezze di Windows il meno possibile, quindi darei ai parametri i tipi HANDLE, bool e int. Ma sono solo io.

    
risposta data 23.10.2016 - 01:22
fonte
0

Lo scopo che servono è di dare agli sviluppatori la certezza di quelle intestazioni su quali siano realmente i tipi. Alcuni dei normali tipi C variano da un compilatore o da un'architettura all'altra.

L'impatto dei tipi di missaggio sull'efficacia è se introduci conversioni di tipo inattese, quindi è una potenziale fonte di bug e altre sub-opportunità.

L'impatto sullo stile è la coerenza. Ad esempio, la miscelazione è coerente se si utilizzano solo i tipi Microsoft per chiamare le proprie API e si utilizzano i tipi normali per il proprio codice. Il mixaggio che va più in profondità di così è probabilmente di cattivo stile perché è incoerente, ma potrebbero esserci delle eccezioni a seconda di come pensi alle categorie nel tuo codice.

    
risposta data 22.10.2016 - 22:46
fonte

Leggi altre domande sui tag