En C ++, los enteros de ancho fijo se definen como opcionales , pero parece que no puedo encontrar la forma recomendada de verificar si realmente están definidos.
¿Cuál sería una forma portátil de verificar si hay enteros de ancho fijo disponibles?
En C ++, los enteros de ancho fijo se definen como opcionales , pero parece que no puedo encontrar la forma recomendada de verificar si realmente están definidos.
¿Cuál sería una forma portátil de verificar si hay enteros de ancho fijo disponibles?
#if defined(INT8_MIN)
cpp
archivo definido y dependiendo de si la compilación falla o no, se establece una macro que puede definir.AC_TYPE_INT8_T
etc.Respuestas:
Para determinar si se proporciona un tipo entero de ancho fijo, puede verificar si se ha definido una de las macros
[U]INT*_MAX
o la correspondiente[U]INT*_MIN
.Según 7.20 tipos enteros
<stdint.h>
, párrafo 4 del estándar C11 (tenga en cuenta las partes en negrita):C ++ hereda la implementación de C a través de
<cstdint>
. Ver<cstdint>
vs<stdint.h>
para algunos detalles. También vea ¿Qué significa__STDC_LIMIT_MACROS
y qué__STDC_CONSTANT_MACROS
significa? para detalles sobre__STDC_LIMIT_MACROS
.Por lo tanto, si
int32_t
está disponible,INT32_MAX
yINT32_MIN
debe ser#define
'd. Por el contrario, siint32_t
no está disponible,INT32_MAX
tampocoINT32_MIN
se les permitirá#define
'd.Sin embargo, tenga en cuenta que, como dijo @NicolBolas en otra respuesta , puede que no sea necesario verificarlo.
fuente
[U]INT*_C
lugar de las macros min y maxINT64_C
se define siint64_least_t
está disponible, no siint64_t
está disponible. Consulte la documentaciónEn términos generales ... no lo haces.
Si necesita usar los tipos enteros de tamaño fijo, eso significa que necesita explícitamente que esos tipos sean de sus tamaños específicos. Es decir, su código no será funcional si no puede obtener enteros de esos tamaños. Entonces deberías usarlos; Si alguien usa su código en un compilador que carece de dichos tipos, entonces su código no se compilará. Lo cual está bien, porque su código no habría funcionado si se compilara.
Si en realidad no necesita enteros de tamaño fijo pero simplemente los quiere por alguna otra razón, use los
int_least_*
tipos. Si la implementación puede darle exactamente ese tamaño, entonces losleast_*
tipos tendrán ese tamaño.fuente
uint8_t
), pero este código de alguna manera necesitaba ejecutarse en una plataforma donde un byte no es de 8 bits (que, además de usar un antigua implementación de C ++, ¿sería la única razón por lauint8_t
que no estaría disponible)? Es decir, fuera de la compatibilidad con versiones anteriores, ¿por qué necesita hacer esto?uint8_t
fue mucho más claro que el enfoque anterior ad-hoc (y con frecuencia roto).O(1)
versusO(n)
esfuerzo. La misma razón por la que la gente usa, por ejemplouint16_t
. Estás preguntando "¿por qué no usar uint32_t y lanzarlo tú mismo?", A lo que la respuesta debería ser obvia.uint16_t
. Mi razón es que me estoy comunicando con un dispositivo / formato / etc. que espera obtener exactamente 16 bits de datos formateados como un entero binario sin signo usando el endian para mi máquina, y si no puedo obtener un tipo que sea precisamente eso, entonces comunicarse efectivamente con él es mucho más difícil. Mi programa (y las API que uso con él) fundamentalmente no pueden funcionar en una máquina que no proporciona eso.