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.
// may be necessary for your C++ implementation
#define __STDC_LIMIT_MACROS
#include <cstdint>
#ifdef INT32_MAX
// int32_t must be available to get here
int32_t some32bitIntVariable;
#endif
Por tipos 7.20 de número inteiro<stdint.h>
, parágrafo 4 da norma C11 (observe as partes em negrito):
Para cada tipo aqui descrito que a implementação fornece, <stdint.h>
deve declarar esse typedef
nome e definir as macros associadas . Por outro lado, para cada tipo aqui descrito que a implementação não fornece, <stdint.h>
não deve declarar esse typedef
nome nem definir as macros associadas .
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
e INT32_MIN
deve ser #define
'd. Por outro lado, se int32_t
não estiver disponível, também INT32_MAX
não INT32_MIN
será permitido #define
.
Observe, porém, como @NicolBolas afirmou em outra resposta , pode não ser necessário realmente verificar.
#if defined(INT8_MIN)