Différence entre size_t et std::size_t
Quelles sont les différences entre size_t
et std::size_t
en termes de où elles sont déclarées, lorsqu'ils doivent être utilisés et toutes les autres caractéristiques de différenciation?
- Je serais intéressé de savoir si le C++ spec liens std::size_t le C type size_t.
- Voir la même question: lien
Vous devez vous connecter pour publier un commentaire.
C
size_t
et C++std::size_t
sont à la fois même.En C, il est défini dans
<stddef.h>
et en C++, il est défini dans<cstddef>
dont le contenu est le même que d'en-tête C (voir la citation ci-dessous). Ses définie comme type entier non signé de la résultat de la sizeof opérateur.C Standard est dit au §17.7/2,
Et C++ Standard dit (à propos de
cstddef
en-tête) dans le §18.1/3,Donc oui, les deux sont les mêmes; la seule différence est que le C++ définit
size_t
dansstd
espace de noms.Veuillez également noter que la ligne ci-dessus dit aussi "avec les modifications suivantes" ce qui n'est pas en se référant à
size_t
. Son plutôt se référant à la nouvelle ajouts (pour la plupart) faite par C++ dans la langue (pas présent dans C), qui sont également définis dans le même en-tête.Wikipédia a de très bonnes infos sur la gamme et la taille de stockage du size_t:
Et le reste vous pouvez lire à partir de cette page sur wikipédia.
size_t
sansusing namespace std;
ouusing std::size_t;
. Cependant, la plupart des compilateurs permettent, et la Norme spécifiquement leur permet d'autoriser (§D. 5/3).<cstddef>
peut ou peut ne pas déclarer::size_t
, de sorte que vous ne pouvez pas compter sur elle pour être là ou être absent, à moins d'être spécifiquement, y compris<stddef.h>
ou un autre en-tête de la bibliothèque C qui est garanti pour le déclarer.::size_t
est présent.e.g dans<stddef.h>
, de sorte que vous n'avez pas toujours besoin de se qualifier avecstd::
.À Partir De C++03 "17.4.3.1.4 Types":
Et note de bas de page 169:
std::T
variantes en cours de définition?#include <stddef.h>
puisstd::size_t
peut ou peut ne pas être disponible. Si vous#include <cstddef>
puisstd::size_t
est disponible, maissize_t
peut-être pas.std::
et le paragraphe dit qu'il peut aussi les définir dans le haut-niveau de l'espace de noms et si elle le fait, elle doit définir de manière identique dansstd::
et de haut niveau. La plupart des compilateurs suffit d'inclure l'en-tête C et importer les noms destd::
, de sorte que les symboles ne finissent définis à la fois.std::
variantes d'identifiants qui viennent du C de la rive. Je m'en tiens à<xxxxx.h>
pour la norme C-têtes - il n'a jamais été un problème. Donc, j'avais à utiliser<stddef.h>
etsize_t
et de ne jamais donner une seconde pensée àstd::size_t
; en fait, il ne me traverse l'esprit qu'il est (ou pourrait être) unestd::size_t
.std::size_t est en fait stddef.h's size_t.
cstddef donne les éléments suivants:
...effectivement apporter à la définition précédente en l'espace de noms std.
<cstddef>
et espérer obtenir::size_t
, mais si vous incluez<stddef.h>
vous obtiendrezstd::size_t
.<stddef.h>
ne fera que vous obtenez::size_t
.<cstddef>
vous êtes assuré d'obtenirstd::size_t
et vous pouvez également obtenir::size_t
(mais il n'est pas garanti). Si vous incluez<stddef.h>
vous êtes garanti d'obtenir::size_t
et vous pouvez également obtenirstd::size_t
(mais il n'est pas garanti). C'était différent en C++03, mais qui a été effectivement unimplementable et fixe comme un défaut.