Em C ++, números inteiros de largura fixa são definidos como opcionais , mas parece que não consigo encontrar a maneira recomendada de verificar se eles estão realmente definidos.
Qual seria uma maneira portátil de verificar se números inteiros de largura fixa estão disponíveis?
#if defined(INT8_MIN)
cpp
arquivo definido e dependendo se a compilação falhar ou não, uma macro que você pode definir está definida.AC_TYPE_INT8_T
etc.Respostas:
Para determinar se um tipo inteiro de largura fixa é fornecido, é possível verificar se uma das macros correspondentes
[U]INT*_MAX
ou[U]INT*_MIN
está definida.Por tipos 7.20 de número inteiro
<stdint.h>
, parágrafo 4 da norma C11 (observe as partes em negrito):C ++ herda a implementação C via
<cstdint>
. Veja<cstdint>
vs<stdint.h>
para mais detalhes. Veja também O que significa__STDC_LIMIT_MACROS
e o que__STDC_CONSTANT_MACROS
significa? para detalhes sobre__STDC_LIMIT_MACROS
.Assim, se
int32_t
estiver disponível,INT32_MAX
eINT32_MIN
deve ser#define
'd. Por outro lado, seint32_t
não estiver disponível, tambémINT32_MAX
nãoINT32_MIN
será permitido#define
.Observe, porém, como @NicolBolas afirmou em outra resposta , pode não ser necessário realmente verificar.
fonte
[U]INT*_C
vez das macros min e maxINT64_C
é definido seint64_least_t
estiver disponível, não seint64_t
estiver disponível. Consulte a documentaçãoEm termos gerais ... você não.
Se você precisar usar os tipos inteiros de tamanho fixo, isso significa que você precisará explicitamente desses tipos para terem seus tamanhos específicos. Ou seja, seu código não funcionará se você não conseguir números inteiros desses tamanhos. Então você deve apenas usá-los; se alguém usar seu código em um compilador que não possui os tipos mencionados, seu código não será compilado. O que é bom, porque seu código não teria funcionado se fosse compilado.
Se você realmente não precisa de números inteiros de tamanho fixo, mas simplesmente os deseja por algum outro motivo, use os
int_least_*
tipos Se a implementação puder fornecer exatamente esse tamanho, osleast_*
tipos terão esse tamanho.fonte
uint8_t
), mas esse código de alguma forma precisava ser executado em uma plataforma em que um byte não tivesse 8 bits (que, além de usar um implementação antiga de C ++, seria a única razão pela qualuint8_t
não estaria disponível)? Ou seja, fora da compatibilidade com versões anteriores, por que você precisou fazer isso?uint8_t
era muito mais claro do que a abordagem ad-hoc anterior (e muitas vezes quebrada).O(1)
versusO(n)
esforço. Mesma razão pela qual as pessoas usam, por exemplouint16_t
. Você está perguntando "por que não usar o uint32_t e lançar você mesmo?", Para o qual a resposta deve ser óbvia.uint16_t
. Meu motivo é que estou me comunicando com um dispositivo / formato / etc que espera obter precisamente 16 bits de dados formatados como um número inteiro binário e sem sinal, usando o endian da minha máquina, e se não conseguir obter um tipo que seja precisamente isso, então comunicar-se efetivamente com ele é muito mais difícil. Meu programa (e as APIs que eu uso com ele) fundamentalmente não pode funcionar em uma máquina que não fornece isso.