L'intention initiale en C++98, c'est que vous devez utiliser <cstdint>
en C++, pour éviter de polluer l'espace de noms global (enfin, pas <cstdint>
en particulier, c'est seulement ajouté en C++11, mais l' <c*>
- têtes en général).
Cependant, les implémentations ont persisté en mettant les symboles dans l'espace de noms global de toute façon, et C++11 ratifié cette pratique[*]. Donc, en gros, vous avez trois options:
- Utiliser
<cstdint>
et soit pleinement qualifier chaque type entier vous utilisez ou bien l'amener à portée avec using std::int32_t;
etc (ennuyeux parce que détaillé, mais c'est la bonne façon de le faire juste comme n'importe quel autre symbole dans le C++ standard library)
- Utiliser
<stdint.h>
(un peu mauvaise car obsolète)
- Utiliser
<cstdint>
et supposons que votre application va mettre des symboles dans l'espace de noms global (très mal car pas de garantie).
Dans la pratique, je soupçonne qu'un ennuyeux grande quantité de code utilise la dernière option, tout simplement parce que c'est facile à faire par accident sur une oeuvre <cstdint>
met les symboles dans l'espace de noms global. Vous devriez essayer d'utiliser la première. La deuxième a une vertu, qu'il est garanti à mettre des choses dans l'espace de noms global au lieu de seulement peut-être le faire. Je ne pense pas que c'est particulièrement utile, mais il peut économiser de taper si c'est votre priorité.
Il y a une quatrième option, #include <cstdint>
suivie par using namespace std;
ce qui est parfois utile, mais il ya des endroits que vous ne devriez pas mettre la using namespace std;
. Des personnes différentes ont des idées différentes où sont ces endroits, mais "au plus haut niveau dans un fichier d'en-tête" est pire que "au plus haut niveau dans un fichier cpp", ce qui est pire que "dans un périmètre limité". Certaines personnes n'ont jamais écrire using namespace std;
à tous.
[*] Que signifie C++ standard en-têtes sont autorisés à mettre des choses dans l'espace de noms global, mais pas une obligation. Donc, vous avez à éviter la collision avec ces symboles, mais vous ne pouvez pas les utiliser parce qu'ils pourraient ne pas être là. Fondamentalement, l'espace de noms global en C++ est un champ de mines, essayez de l'éviter. On pourrait faire valoir que le comité a ratifié la pratique par des implémentations qui est presque aussi néfaste qu'un collant using namespace std;
au plus haut niveau dans un fichier d'en-tête -- la différence étant que les implémentations seulement le faire pour les symboles dans la bibliothèque standard C, alors que using namespace std;
- t-il pour C++-seulement les symboles de trop. Il y a une section dans le C standard que des listes de noms réservés pour les futurs ajouts à la norme. Il n'est pas complètement stupide idée de traiter ces noms réservés (C++) espace de noms global, mais il n'est pas essentiel.