Si desea utilizar Qt , debe abrazar quint8, quint16y así sucesivamente.
Si desea utilizar GLib , debe darle la bienvenida guint8, guint16etc.
En Linux los hay u32, s16y así sucesivamente.
uC / OS define SINT32, UINT16y 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 u32se typedefterminará longy quint32se typedefterminará inty 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.hse inventó.sizeof(int) * CHAR_BIT(por ejemplo) y usarlo? Si suintes demasiado pequeño para representar su rango (por ejemplo, un índice de matriz), entonces es casi seguro que no debería usarlo deinttodos modos, sino algo comosize_t. ¿Por qué tendríaint32má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 sufastoleastvariante). Mi punto es: estos tipos son convenientes de usar y tienen su razón de existencia.size_ty / ouint64_t.Respuestas:
stdint.hno existía cuando se estaban desarrollando estas bibliotecas. Entonces, cada biblioteca hizo sus propiastypedefs.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_ty 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_ttipos son opcionales, pero los tiposuint_leastN_tyuint_fastN_tno lo son.stdint.hse 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.hse 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.hes que incluso en plataformas en las que, por ejemplo,longyint32_ttienen 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