2009-09-24 16 views
26

En C99, j'inclus stdint.h et cela me donne UINT32_MAX ainsi que uint32_t. Cependant, en C++, UINT32_MAX est défini. Je peux définir __STDC_LIMIT_MACROS avant d'inclure stdint.h, mais cela ne fonctionne pas si quelqu'un inclut mon en-tête après avoir déjà inclus stdint.h.Quel est l'équivalent C++ de UINT32_MAX?

Donc, en C++, quelle est la manière standard de trouver la valeur maximale représentable dans un uint32_t?

+7

remarque nécromancie: '' #include en C++ – AJG85

+0

@ AJG85 a la bonne réponse. –

Répondre

48

Eh bien, je ne sais pas uint32_t mais pour les types fondamentaux (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double) vous devez utiliser les modèles 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; 

Si uint32_t est un #define d'un de ce qui précède que ce code devrait fonctionner hors de la boîte

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

ou si 'uint32_t' est un' typedef' de l'un des éléments ci-dessus? –

+0

J'espère vraiment que c'est un typedef. Si vos outils utilisent un '# define' pour cela, je doute de leur qualité. – John

+0

Afin d'éviter numeric_limits :: min(), numeric_limits :: max() d'être confondu avec std :: min() et std :: max() je devais l'entourer entre parenthèses comme ceci: (std :: numeric_limits :: max)(); –

18

std::numeric_limits<T>::max() définit la valeur maximale pour le type T.

20

Eh bien, uint32_t aura toujours 32 bits, et toujours non signé, de sorte que vous pouvez définir en toute sécurité manuellement:

#define UINT32_MAX (0xffffffff) 

Vous pouvez également faire

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

Nous n'avons pas besoin de recourir à cela lorsque nous avons des constructions C++ standard parfaitement valides qui n'utilisent que 3 fois plus de caractères. – John

+1

@John: Ceci est parfaitement standard et portable. –

+0

Et les bibliothèques standard ne sont pas toujours disponibles - pour le code du module du noyau, par ex. ... – mtahmed

1

Vous pouvez être en mesure d'éliminer les #include problèmes d'ordre en changeant votre processus de construction pour définir le symbole __STDC_LIMIT_MACROS sur la ligne de commande du compilateur à la place:

cxx -D__STDC_LIMIT_MACROS ... 

Bien sûr, vous auriez encore des problèmes si un en-tête #undef s ce symbole. En outre, les auteurs de l'implémentation de bibliothèque standard que vous utilisez n'ont peut-être pas eu l'intention de définir ce symbole particulier pour les utilisateurs; il peut y avoir un indicateur de compilateur ou un symbole différent que les utilisateurs sont censés utiliser pour activer les types C99 en C++.

1

Je ne peux pas commenter alors voici mon entrée sur la réponse de Glen vs Lior Kogan. Si vous utilisez des variables statiques, vous rencontrerez le problème que si vous attribuez une valeur constante à une classe à numeric_limits :: max(), cette valeur sera en fait mise à zéro en raison de l'ordre d'initialisation (voir ce poste zero initialization and static initialization of local scope static variable)

Donc, dans ce cas, cela ne fonctionnera qu'en utilisant la réponse 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) 
Questions connexes