L'intention originale dans C ++ 98 était que vous devriez utiliser <cstdint>
en C ++, pour éviter de polluer l'espace de noms global (enfin, pas <cstdint>
en particulier, cela n'est ajouté qu'en C ++ 11, mais les en- <c*>
têtes en général).
Cependant, les implémentations ont persisté à placer les symboles dans l'espace de noms global de toute façon, et C ++ 11 a ratifié cette pratique [*]. Donc, vous avez essentiellement trois options:
- Utilisez
<cstdint>
et qualifiez complètement chaque type d'entier que vous utilisez ou mettez-le dans la portée avec using std::int32_t;
etc (ennuyeux car verbeux, mais c'est la bonne façon de le faire comme pour tout autre symbole de la bibliothèque standard C ++)
- Utilisation
<stdint.h>
(légèrement mauvaise car obsolète)
- Utilisez
<cstdint>
et supposez que votre implémentation placera les symboles dans l'espace de noms global (très mauvais car non garanti).
En pratique, je soupçonne qu'une grande quantité de code ennuyeuse utilise la dernière option, simplement parce que c'est facile à faire par accident sur une implémentation où <cstdint>
met les symboles dans l'espace de noms global. Vous devriez essayer d'utiliser le premier. Le second a une vertu, c'est qu'il est garanti de mettre des choses dans l'espace de noms global au lieu de le faire peut-être seulement. Je ne pense pas que ce soit particulièrement utile, mais cela pourrait vous faire gagner du temps si c'est votre priorité.
Il y a une quatrième option, #include <cstdint>
suivie de using namespace std;
laquelle est parfois utile, mais il y a des endroits où vous ne devriez pas mettre le fichier using namespace std;
. Différentes personnes auront des idées différentes où se trouvent ces endroits, mais «au niveau supérieur dans un fichier d'en-tête» est pire que «au niveau supérieur dans un fichier cpp», ce qui est pire que «dans une portée limitée». Certaines personnes n'écrivent jamais using namespace std;
du tout.
[*] Cela signifie que les en-têtes standards C ++ sont autorisés à placer des éléments dans l'espace de noms global mais pas obligés de le faire. Vous devez donc éviter d'entrer en collision avec ces symboles, mais vous ne pouvez pas les utiliser car 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 soutenir que le comité a ratifié une pratique par des implémentations qui est presque aussi nuisible que de rester using namespace std;
au niveau supérieur dans un fichier d'en-tête - la différence étant que les implémentations ne le font que pour les symboles de la bibliothèque standard C, alors using namespace std;
que pour C ++ -seulement symboles aussi. Il y a une section dans la norme C qui répertorie les noms réservés pour de futurs ajouts à la norme. Ce n'est pas une idée complètement stupide de traiter ces noms comme réservés dans l'espace de noms global C ++, mais ce n'est pas essentiel.
<cstdint>
. Voici l'erreur que je reçois:./misc.h:7:10: fatal error: 'cstdint' file not found
.