Compartir a través de


Convenciones de codificación de Windows

Si no está familiarizado con la programación de Windows, puede desconcertar la primera vez que vea un programa de Windows. El código se rellena con definiciones de tipo extrañas, como DWORD_PTR y LPRECT, y las variables tienen nombres como hWnd y pwsz (denominada notación húngara). Merece la pena tomar un momento para aprender algunas de las convenciones de codificación de Windows.

La gran mayoría de las API de Windows constan de funciones o interfaces del modelo de objetos componentes (COM). Se proporcionan muy pocas API de Windows como clases de C++. (Una excepción notable es GDI+, una de las API de gráficos 2D).

Typedefs

Los encabezados de Windows contienen una gran cantidad de definiciones de tipo. Muchos de estos se definen en el archivo de encabezado WinDef.h. Estos son algunos de los que encontrarás a menudo.

Tipos enteros

Tipo de datos Size ¿Firmado?
BYTE 8 bits Sin signo
DWORD 32 bits Sin signo
INT32 32 bits Firmado
INT64 64 bits Firmado
LONG 32 bits Firmado
LONGLONG 64 bits Firmado
UINT32 32 bits Sin signo
UINT64 64 bits Sin signo
ULONG 32 bits Sin signo
ULONGLONG 64 bits Sin signo
WORD 16 bits Sin signo

Como puede ver, hay una cierta cantidad de redundancia en estas definiciones de tipo. Algunas de estas superposiciones simplemente se deben al historial de las API de Windows. Los tipos que se enumeran aquí tienen un tamaño fijo y los tamaños son los mismos en aplicaciones de 32 y 64 bits. Por ejemplo, el tipo DWORD siempre tiene 32 bits de ancho.

Tipo Boolean

BOOL es un alias de tipo para int, distinto de la bool de C++, y de otros tipos que representan un valor booleano . El archivo WinDef.h de encabezado también define dos valores para su uso con BOOL.

#define FALSE    0 
#define TRUE     1

Sin embargo, a pesar de esta definición de TRUE, la mayoría de las funciones que devuelven un tipo BOOL pueden devolver cualquier valor distinto de cero para indicar la verdad booleana. Por lo tanto, siempre debe escribir esto:

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

// or

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

y no esto:

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

BOOL es un tipo entero y no es intercambiable con la bool de C++.

Tipos de puntero

Windows define muchos tipos de datos del puntero a X del formulario. Normalmente tienen el prefijo P- o LP- en el nombre. Por ejemplo, LPRECT es un puntero a un RECT, donde RECT es una estructura que describe un rectángulo. Las siguientes declaraciones de variable son equivalentes.

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

En las arquitecturas de 16 bits (Windows de 16 bits), hay 2 tipos de punteros, P para "puntero" y LP significa "puntero largo". Se necesitaban punteros largos (también denominados punteros lejanos) para abordar los intervalos de memoria fuera del segmento actual. El prefijo LP se ha conservado para facilitar el puerto de código de 16 bits a Windows de 32 bits. Hoy en día no hay distinción, y estos tipos de puntero son todos equivalentes. Evite usar estos prefijos; o si debe usar uno, use P.

Tipos de precisión de puntero

Los siguientes tipos de datos son siempre el tamaño de un puntero, es decir, 32 bits de ancho en aplicaciones de 32 bits y 64 bits de ancho en aplicaciones de 64 bits. El tamaño se determina en tiempo de compilación. Cuando una aplicación de 32 bits se ejecuta en Windows de 64 bits, estos tipos de datos siguen siendo de 4 bytes de ancho. (Una aplicación de 64 bits no se puede ejecutar en Windows de 32 bits, por lo que no se produce la situación inversa).

  • DWORD_PTR
  • INT_PTR
  • LONG_PTR
  • ULONG_PTR
  • UINT_PTR

Estos tipos se usan en situaciones en las que un entero se puede convertir a un puntero. También se usan para definir variables para la aritmética de punteros y para definir contadores de bucle que recorren en iteración todo el intervalo de bytes en búferes de memoria. Por lo general, aparecen en lugares donde un valor de 32 bits existente se expandió a 64 bits en Windows de 64 bits.

Notación húngara

La notación húngara es la práctica de agregar prefijos a los nombres de las variables, para proporcionar información adicional sobre la variable. (El inventor de la notación, Charles Simonyi, era húngaro, por lo tanto su nombre).

En su forma original, la notación húngara proporciona información semántica sobre una variable, indicando el uso previsto. Por ejemplo, i significa un índice, cb significa un tamaño en bytes ("recuento de bytes") y rw y número de fila y columna medio de col. Estos prefijos están diseñados para evitar el uso accidental de una variable en el contexto incorrecto. Por ejemplo, si vio la expresión rwPosition + cbTable, sabría que se agrega un número de fila a un tamaño, que es casi ciertamente un error en el código.

Una forma más común de notación húngara usa prefijos para proporcionar información de tipo , por ejemplo, dw para DWORD y w para WORD.

Nota

Las directrices básicas de C++ desalentan la notación de prefijo (por ejemplo, notación húngara). Consulte NL.5: Evitar la codificación de información de tipo en nombres. Internamente, el equipo de Windows ya no lo usa. Pero su uso permanece en ejemplos y documentación.

Siguientes

Trabajo con cadenas