Si desea utilizar Qt , debe abrazar quint8
, quint16
y así sucesivamente.
Si desea utilizar GLib , debe darle la bienvenida guint8
, guint16
etc.
En Linux los hay u32
, s16
y así sucesivamente.
uC / OS define SINT32
, UINT16
y así sucesivamente.
Y si tiene que usar alguna combinación de esas cosas, será mejor que esté preparado para los problemas. Porque en su máquina u32
se typedef
terminará long
y quint32
se typedef
terminará int
y el compilador se quejará .
¿Por qué todo el mundo hace esto, si lo hay <stdint.h>
? ¿Es esto algún tipo de tradición para las bibliotecas?
stdint.h
se inventó.sizeof(int) * CHAR_BIT
(por ejemplo) y usarlo? Si suint
es demasiado pequeño para representar su rango (por ejemplo, un índice de matriz), entonces es casi seguro que no debería usarlo deint
todos modos, sino algo comosize_t
. ¿Por qué tendríaint32
más sentido? La única vez que el ancho fijo tiene sentido es para la comunicación entre sistemas (por ejemplo, formato de archivo / red) ...uint16_t
(o tal vez sufast
oleast
variante). Mi punto es: estos tipos son convenientes de usar y tienen su razón de existencia.size_t
y / ouint64_t
.Respuestas:
stdint.h
no existía cuando se estaban desarrollando estas bibliotecas. Entonces, cada biblioteca hizo sus propiastypedef
s.fuente
Para las bibliotecas más antiguas, esto es necesario porque el encabezado en cuestión (
stdint.h
) no existía.Sin embargo, todavía hay un problema: esos tipos (
uint64_t
y otros) son una característica opcional en el estándar. Por lo tanto, es posible que una implementación compatible no se incluya con ellos y, por lo tanto, obligue a las bibliotecas a incluirlos hoy en día.fuente
uintN_t
tipos son opcionales, pero los tiposuint_leastN_t
yuint_fastN_t
no lo son.stdint.h
se ha estandarizado desde 1999. Es más probable que muchas aplicaciones definan (efectivamente, alias) tipos para mantener una independencia parcial de la arquitectura de la máquina subyacente.Proporcionan a los desarrolladores la confianza de que los tipos utilizados en su aplicación coinciden con los supuestos específicos de su proyecto sobre el comportamiento que puede no coincidir con el estándar de lenguaje o la implementación del compilador.
La práctica se refleja en el patrón de diseño de fachada orientada a objetos y es muy abusada por los desarrolladores que invariablemente escriben clases contenedoras para todas las bibliotecas importadas.
Cuando los cumplidores eran mucho menos estándar y las arquitecturas de las máquinas podían variar de mainframes de 16 bits, 18 bits a 36 bits de longitud de palabra, esto era mucho más importante. La práctica es mucho menos relevante ahora en un mundo que converge en sistemas integrados ARM de 32 bits. Sigue siendo una preocupación para los microcontroladores de gama baja con mapas de memoria extraños .
fuente
stdint.h
se ha estandarizado desde 1999, pero ¿cuánto tiempo ha estado disponible en la práctica? La gente se demora en implementar y adoptar nuevos estándares, y durante ese largo período de transición, los métodos antiguos siguen siendo imprescindibles.stdint.h
es que incluso en plataformas en las que, por ejemplo,long
yint32_t
tienen el mismo tamaño y representación, no hay ningún requisito de que al lanzar unint32_t*
tolong*
produzca un puntero que pueda acceder de manera confiable a aint32_t
. No puedo creer que los autores del Estándar pensaran que era obvio que los tipos compatibles con el diseño deberían ser compatibles con los alias, pero como no se molestaron en decirlo, los autores de gcc y IIRC clang piensan que el lenguaje se mejoraría si se ignoraran los alias incluso en los casos en que sea obvio.-fno-strict-alias
, pero que aún funcionaría. Incluso si no hubiera una base de código existente, ningún conjunto único de reglas podría lograr el equilibrio óptimo de optimización y semántica para todas las aplicaciones, porque diferentes aplicaciones tienen diferentes necesidades. Agregue el código base existente y la necesidad de diferentes modos debería quedar clara.Entonces tienes el poder de escribir def char a int.
Un "horror de codificación" mencionó que el encabezado de una empresa tenía un punto en el que un programador quería un valor booleano, y un char era el tipo nativo lógico para el trabajo, y así lo escribió
typedef bool char
. Luego, más tarde, alguien encontró que un número entero era la opción más lógica y escribiótypedef bool int
. El resultado, años antes de Unicode, fue virtualmentetypedef char int
.Creo que hay mucha compatibilidad progresiva y progresista.
fuente