Condividi tramite


Convenzioni di codifica di Windows

Se non si è nuovi alla programmazione di Windows, può essere disconcertante quando viene visualizzato prima un programma Windows. Il codice viene riempito con definizioni di tipi strane come DWORD_PTR e LPRECT e le variabili hanno nomi come hWnd e pwsz (chiamata notazione ungherese). Vale la pena prendere un momento per imparare alcune delle convenzioni di codifica di Windows.

La maggior parte delle API Windows è costituita da funzioni o interfacce COM (Component Object Model). Poche API Di Windows vengono fornite come classi C++. Un'eccezione notevole è GDI+, una delle API grafiche 2D.

Typedef

Le intestazioni di Windows contengono un sacco di typedef. Molti di questi sono definiti nel file di intestazione WinDef.h. Ecco alcuni che incontrerai spesso.

Tipi integer

Tipo di dati Dimensione Firmato?
BYTE 8 bit Senza segno
DWORD 32 bit Senza segno
INT32 32 bit Con segno
INT64 64 bit Con segno
LONG 32 bit Con segno
LONGLONG 64 bit Con segno
UINT32 32 bit Senza segno
UINT64 64 bit Senza segno
ULONG 32 bit Senza segno
ULONGLONG 64 bit Senza segno
WORD 16 bit Senza segno

Come si può notare, c'è una certa quantità di ridondanza in questi typedef. Alcune di queste sovrapposizioni sono semplicemente dovute alla cronologia delle API di Windows. I tipi elencati qui hanno dimensioni fisse e le dimensioni sono uguali in entrambe le applicazioni a 32 bit e a 64. Ad esempio, il tipo DWORD è sempre a 32 bit a larghezza.

Tipo booleano

BOOL è un alias di tipo per int, distinto dal bool di C++e da altri tipi che rappresentano un valore booleano . Il file WinDef.h di intestazione definisce anche due valori da usare con BOOL.

#define FALSE    0 
#define TRUE     1

Nonostante questa definizione di TRUE, tuttavia, la maggior parte delle funzioni che restituiscono un tipo BOOL può restituire qualsiasi valore non zero per indicare la verità booleana. Pertanto, è consigliabile scrivere sempre questo:

// Right way.
if (SomeFunctionThatReturnsBoolean()) 
{ 
    ...
}

// or

if (SomeFunctionThatReturnsBoolean() != FALSE)
{ 
    ...
}

e non questo:

if (result == TRUE) // Wrong!
{
    ... 
}

BOOL è un tipo integer e non è intercambiabile con il bool di C++.

Tipi di puntatore

Windows definisce molti tipi di dati del puntatore a X del modulo. Questi in genere hanno il prefisso P - o LP- nel nome. Ad esempio, LPRECT è un puntatore a un RECT, dove RECT è una struttura che descrive un rettangolo. Le dichiarazioni di variabili seguenti sono equivalenti.

RECT*  rect;  // Pointer to a RECT structure.
LPRECT rect;  // The same
PRECT  rect;  // Also the same.

Nelle architetture a 16 bit (Windows a 16 bit) sono disponibili 2 tipi di puntatori, P per "puntatore" e LP è "puntatore lungo". I puntatori lunghi (chiamati anche puntatori lontani) erano necessari per indirizzare gli intervalli di memoria all'esterno del segmento corrente. Il prefisso LP è stato mantenuto per semplificare la porta del codice a 16 bit a Windows a 32 bit. Oggi non esiste alcuna distinzione e questi tipi di puntatore sono tutti equivalenti. Evitare di usare questi prefissi; o se è necessario usarlo, usare P.

Tipi di precisione puntatore

I tipi di dati seguenti sono sempre le dimensioni di un puntatore, ovvero 32 bit a larghezza in applicazioni a 32 bit e 64 bit a 64 bit in applicazioni a 64 bit. La dimensione viene determinata in fase di compilazione. Quando un'applicazione a 32 bit viene eseguita in Windows a 64 bit, questi tipi di dati sono ancora a 4 byte. Un'applicazione a 64 bit non può essere eseguita in Windows a 32 bit, quindi la situazione inversa non si verifica.

  • DWORD_PTR
  • INT_PTR
  • LONG_PTR
  • ULONG_PTR
  • UINT_PTR

Questi tipi vengono usati in situazioni in cui un intero può essere eseguito il cast in un puntatore. Vengono inoltre usati per definire le variabili per l'aritmetica puntatore e per definire i contatori del ciclo che eseguono l'iterazione sull'intervallo completo di byte nei buffer di memoria. In genere, vengono visualizzati in posizioni in cui un valore a 32 bit esistente è stato espanso a 64 bit in Windows a 64 bit.

Notazione ungherese

La notazione ungherese è la pratica di aggiungere prefissi ai nomi delle variabili, per fornire informazioni aggiuntive sulla variabile. (L'inventore della notazione, Charles Simonyi, era ungherese, quindi il suo nome).

Nella forma originale, la notazione ungherese fornisce informazioni semantiche su una variabile, dicendo l'uso previsto. Ad esempio, i significa un indice, cb significa una dimensione in byte ("conteggio di byte") e rw e col media riga e numeri di colonna. Questi prefissi sono progettati per evitare l'uso accidentale di una variabile nel contesto errato. Ad esempio, se è stata visualizzata l'espressione rwPosition + cbTable, si sa che un numero di riga viene aggiunto a una dimensione, che è quasi certamente un bug nel codice

Una forma più comune di notazione ungherese usa i prefissi per fornire informazioni sul tipo , ad esempio dw per DWORD e w per WORD.

Nota

Le linee guida di base C++ scoraggiano la notazione del prefisso (ad esempio, la notazione ungherese). Vedere NL.5: evitare informazioni sul tipo di codifica nei nomi. Internamente, il team di Windows non lo usa più. Tuttavia, l'uso rimane negli esempi e nella documentazione.

Prossima

Uso delle stringhe