No se trata de abreviar los nombres, sino acerca de la portabilidad. Las diferentes plataformas necesitarán escribir esas cosas de manera diferente.
En Std-C, long
puede ser de 32 o 64 bits, dependiendo de su compilador/destino, por lo que no se puede suponer con seguridad que tiene un tamaño determinado. Un autor de la biblioteca escribirá así su propio tipo, garantizando un cierto tamaño, con el conocimiento de la plataforma objetivo.
E.g.
#ifdef _WIN32
typedef __int64 INT64; // long will not be 64 bit on Windows/VC.
#elif __GNU_C__
typedef long INT64; // gcc typically uses 64 bit longs.
#elif // ... other platforms ...
...
#endif
Y si compiladores cambiar las propiedades de tipo en versiones futuras, los tipos se pueden editar en un solo lugar.
En el pasado también tuvo un caso típico en el int
podría ser de 16 o 32 bits de tamaño, por lo que no podría simplemente utilizar el crudo tipo int
de código en el que necesitaba un argumento -sized DWORD
.
De ahí que tenga cosas como LPARAM
y WPARAM
.
También se utiliza como una forma de abstracción. Es por ello que se ve typedefs como
typedef int Handle;
Porque si bien se trata de una int
ahora, el autor de la biblioteca se reserva la posibilidad de cambiar más adelante por la pista a cualquier otra cosa, por ejemplo un void *
, o de cualquier otro tipo que consideren necesarias.
Pero el código del cliente no necesita saber específicamente que es int
, ya que es lo que actualmente es. Todo lo que el cliente necesita saber es pasarlo a las funciones que aceptan un tipo Handle
.
Typedefs también permiten la configuración en tiempo de compilación. P.ej. algunas bibliotecas pueden tener un tipo Real
para números reales. Se podría definir de una manera como
#ifdef USE_DOUBLE_PREC
typedef double Real;
#else
typedef float Real;
#endif
Y el usuario de la biblioteca se puede configurar opcionalmente /DUSE_DOUBLE_PREC
al compilar para conseguir el apoyo de doble precisión flotador, pero lo importante es que ningún código de la biblioteca tiene que cambiar para que esto trabajo, ya que ha sido abstraído.
El punto fijo y el flotador tienen tan poco en común que cualquier código que funcione con punto fijo probablemente desee y debería usar punto fijo en todas partes ... –
Se sorprenderá de lo fácil que es abstraer eso en una clase. Una empresa para la que contraté trabajo tenía un motor que tenía BLAH_FLOAT (donde "BLAH" eran las iniciales de su empresa) en todas partes, por lo que las versiones de código DS y no DS coexistían pacíficamente. –
No quise decir en implementación sino en semántica. Por ejemplo, si sus valores son coordenadas, deben ser punto fijo o punto flotante con un sesgo ** enorme ** agregado. De lo contrario, la precisión varía según la posición, ya que es mucho más alta en el origen que muy alejada de ella, lo que significa que el comportamiento no es invariable por la traducción. –