2009-09-24 21 views
26

En C99, incluyo stdint.h y eso me da UINT32_MAX y uint32_t. Sin embargo, en C++, el UINT32_MAX se define. Puedo definir __STDC_LIMIT_MACROS antes de incluir stdint.h, pero esto no funciona si alguien está incluyendo mi encabezado después de haber incluido stdint.h.¿Cuál es el equivalente en C++ de UINT32_MAX?

Entonces, en C++, ¿cuál es la forma estándar de encontrar el valor máximo representable en uint32_t?

+7

nigromántica nota al margen: '' # include en C++ – AJG85

+0

@ AJG85 tiene la respuesta correcta. –

Respuesta

48

Bueno, no sé acerca uint32_t pero para los tipos fundamentales (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double) se debe utilizar las plantillas a través de numeric_limits#include <limits>.

cout << "Minimum value for int: " << numeric_limits<int>::min() << endl; 
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl; 

Si uint32_t es una #define de uno de los anteriores que este código debería funcionar fuera de la caja

cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl; 
+3

o si 'uint32_t' es un' typedef' de uno de los anteriores? –

+0

Espero que sea un typedef. Si sus herramientas usan un '# define' para eso, cuestiono su calidad. – John

+0

Para evitar que numeric_limits :: min(), numeric_limits :: max() se confunda con std :: min() y std :: max() tuve que encerrarlo entre paréntesis como este: (std :: numeric_limits :: max)(); –

18

std::numeric_limits<T>::max() define el valor máximo para el tipo T.

20

Bueno, uint32_t siempre habrá 32 bits, y siempre estar sin firmar, por lo que puede definir con seguridad de forma manual:

#define UINT32_MAX (0xffffffff) 

también se puede hacer

#define UINT32_MAX ((uint32_t)-1) 
+20

No necesitamos recurrir a eso cuando tenemos construcciones estándar de C++ perfectamente válidas que usan solo 3 veces más caracteres. – John

+1

@John: Esto es perfectamente estándar y portátil también. –

+0

Y es posible que las bibliotecas estándar no siempre estén disponibles, por ejemplo, para el código del módulo kernel, p. Ej. ... – mtahmed

1

Usted puede ser capaz de eliminar los #include problemas de orden cambiando proceso de construcción para definir el símbolo __STDC_LIMIT_MACROS en la línea de comandos del compilador en su lugar:

cxx -D__STDC_LIMIT_MACROS ... 

Por supuesto, todavía tendría problemas si una cabecera #undef s este símbolo.

Además, los autores de la implementación de la biblioteca estándar que está utilizando podrían no haber tenido la intención de que los usuarios configuraran ese símbolo en particular; puede haber un indicador del compilador o un símbolo diferente que los usuarios deben usar para habilitar los tipos C99 en C++.

1

No puedo comentar, así que esta es mi opinión sobre la respuesta de Glen vs Lior Kogan.

Si está utilizando variables estáticas, se encontrará con el problema de que si asigna un valor constante dentro de una clase a numeric_limits :: max() ese valor se establecerá en cero debido al orden de inicialización (ver esta publicación zero initialization and static initialization of local scope static variable)

Entonces, en ese caso, solo funcionará utilizando la respuesta de Lior Kogan.

// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan 
#define UINT32_MAX ((uint32_t)-1) 
Cuestiones relacionadas