Qual è il C ++ equivalente di UINT32_MAX?
Domanda
In C99, includo stdint.h e che mi dà UINT32_MAX così come uint32_t. Tuttavia, in C ++ l'UINT32_MAX viene definito fuori. Posso definire __STDC_LIMIT_MACROS prima di includere stdint.h, ma questo non funziona se qualcuno è compreso il mio colpo di testa dopo aver già compreso stdint.h stessi.
Quindi, in C ++, qual è il modo standard di scoprire la rappresentabili valore massimo in un uint32_t?
Soluzione
Beh, io non so uint32_t
ma per i tipi fondamentali (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double
) si dovrebbe utilizzare i modelli numeric_limits
via #include <limits>
.
cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
Se uint32_t
è un #define
di uno dei precedenti di questo codice dovrebbe funzionare out of the box
cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;
Altri suggerimenti
std::numeric_limits<T>::max()
definisce il valore massimo per il tipo T
.
Bene, uint32_t sarà sempre a 32 bit, e sempre senza segno, quindi si può tranquillamente definire manualmente:
#define UINT32_MAX (0xffffffff)
È anche possibile fare
#define UINT32_MAX ((uint32_t)-1)
Si può essere in grado di eliminare i problemi di ordine #include
modificando il processo di compilazione per definire il simbolo __STDC_LIMIT_MACROS
sulla riga di comando del compilatore invece:
cxx -D__STDC_LIMIT_MACROS ...
Naturalmente, si sarebbe ancora avere problemi se un'intestazione #undef
s questo simbolo.
Inoltre, l'implementazione di libreria standard gli autori che si sta utilizzando potrebbe non avere destinata agli utenti di impostare quel simbolo particolare; ci potrebbe essere una bandiera compilatore o un simbolo diverso che gli utenti hanno lo scopo di utilizzare per abilitare i tipi C99 in C ++.
Non posso commentare ecco il mio contributo su Glen vs risposta di Lior Kogan.
Se si utilizza variabili statiche vi imbatterete nel problema che se si assegna un valore costante all'interno di una classe di numeric_limits :: max () tale valore sarà infatti impostato a zero a causa dell'ordine di inizializzazione (vedere questo alberino nullo inizializzazione e l'inizializzazione statica variabile statica ambito locale )
Quindi, in questo caso funzionerà solo utilizzando la risposta di 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)