104 votes

<cstdint> contre <stdint.h>

Quelle est la différence entre stdint.h et cstdint?

Deux d'entre eux sont disponibles dans MSVC (Visual Studio 2010) et gcc-4.5.1. À la fois de définir l' intX_t/uintX_t types (où X est la taille en octets du type).

  • Si la justification dans les en-têtes est le même (portable types), quelles sont les décisions que je dois prendre pour décider une ou de l'autre?

L' stdint.h définit chaque type sans aucun espace de noms, l' cstdint types réside dans l' std d'espace de noms.

  • Est-il une raison pour inclure ou ne pas inclure les types définis dans l' std de l'espace de noms? Quelle est la différence entre les deux en-têtes?

cstdint n'a pas d'extension de fichier et utilise l' c préfixe, stdint.h utilise l' .h extension.

  • Quelles sont les conventions de nommage pour ce les en-têtes? l' c préfixe indique que c'est une bibliothèque C? il y a une raison pour l'absence de l'extension de fichier dans cstdint?

132voto

Steve Jessop Points 166970

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.

16voto

Alok Save Points 115848

Y compris cstdint de ses importations, le symbole de noms dans l'espace de noms std et éventuellement dans l'espace de noms Global.
Y compris stdint.h de ses importations, le symbole de noms dans l'espace de noms Global et éventuellement dans l'espace de noms std.

Fonctions de la Bibliothèque C standard sont également fournis dans la Norme C++ de la bibliothèque et d'une manière générale convention d'affectation de noms, ils sont pré-entrée par un c pour les noms correspondants dans la bibliothèque C standard.

En C++, Vous devriez être en utilisant:

#include <cstdint>

et entièrement qualifier les noms de symboles que vous utilisez, std::
alors qu'en C, Vous devez utiliser:

#include <stdint.h>

Annexe D (normative) fonctions de Compatibilité [depr] les états:

D. 6 bibliothèque standard C-têtes

1 Pour la compatibilité avec la bibliothèque standard C et le C Unicode TR, le C++ de la bibliothèque standard fournit la de 25 ° C, en-têtes, comme indiqué dans le Tableau 151.

Qui comprennent:

<assert.h> <float.h> <math.h> <stddef.h> <tgmath.h> <complex.h> <inttypes.h> <setjmp.h> <stdio.h> <time.h> <ctype.h> <iso646.h> <signal.h> <stdint.h> <uchar.h> <errno.h> <limits.h> <stdarg.h> <stdlib.h> <wchar.h> <fenv.h> <locale.h> <stdbool.h> <string.h> <wctype.h>

Et de plus,

2 Chaque en-tête C, dont chacune a un nom de la forme name.h, se comporte comme si chaque nom placé dans la bibliothèque standard de l'espace de noms par la correspondante cname header est placé à l'intérieur de l'espace de noms global portée. Il n'est pas précisé si ces noms sont d'abord déclarée ou définie à l'intérieur de l'espace de noms de la portée (3.3.6) de l'espace de noms std et sont ensuite injectés dans l'espace de noms global portée par l'explicite à l'aide de déclarations (7.3.3).

3 [ Exemple: L'en-tête <cstdlib> assurément offre à ses déclarations et les définitions dans l'espace de noms std. Il peut également fournir ces noms dans l'espace de noms global. L'en-tête <stdlib.h> assurément fournit les mêmes déclarations et les définitions à l'intérieur de l'espace de noms global, comme dans le C Standard. Il peut également fournir ces noms dans l'espace de noms std. fin de l'exemple ]

0voto

hate-engine Points 1250
  1. cstdint est l'en-tête C ++ 11, stdint.h est l'en-tête C99 (C et C ++ sont des langages différents!)

  2. MSVC 2008 ne contient ni stdint.h ni cstdint .

  3. Les implémentations de cstdint sont la plupart du temps simplement #include <stdint.h> avec des correctifs d'espace de noms / langue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X