Quali sono le differenze tra size_t
e std::size_t
in termini di dove vengono dichiarate, quando dovrebbero essere utilizzate e qualsiasi altra caratteristica di differenziazione?
Quali sono le differenze tra size_t
e std::size_t
in termini di dove vengono dichiarate, quando dovrebbero essere utilizzate e qualsiasi altra caratteristica di differenziazione?
Risposte:
C size_t
e C ++ std::size_t
sono entrambi uguali.
In C, è definito in <stddef.h>
e in C ++, è definito nei <cstddef>
cui contenuti sono gli stessi dell'intestazione C (vedere la citazione seguente). Sua definita senza segno tipo integer del risultato del sizeof operatore.
C Standard dice in §17.7 / 2,
size_t che è il tipo intero senza segno del risultato della sizeof operatore
E lo standard C ++ dice (sull'intestazione cstddef
) in §18.1 / 3,
I contenuti sono gli stessi dell'intestazione della libreria C standard, con le seguenti modifiche .
Quindi sì, entrambi sono uguali; l'unica differenza è che C ++ definisce size_t
nello std
spazio dei nomi.
Si noti inoltre che la riga sopra dice anche "con le seguenti modifiche" a cui non fa riferimento size_t
. Si riferisce piuttosto alle nuove aggiunte (principalmente) fatte da C ++ nel linguaggio (non presente in C) che sono anche definite nella stessa intestazione.
Wikipedia ha ottime informazioni su intervallo e dimensioni di archiviazione di size_t:
Intervallo e dimensioni di archiviazione di size_t
Il tipo effettivo di size_t dipende dalla piattaforma ; un errore comune è supporre che size_t sia uguale a unsigned int, il che può portare ad errori di programmazione, [3] [4] quando si passa da un'architettura a 32 a 64 bit, ad esempio.
Secondo lo standard ISO C del 1999 (C99), size_t è un tipo intero senza segno di almeno 16 bit.
E il resto è possibile leggere da questa pagina su Wikipedia.
size_t
senza using namespace std;
o using std::size_t;
. Tuttavia, la maggior parte dei compilatori lo consente e lo Standard consente espressamente loro di consentirlo (§D.5 / 3).
<cstddef>
può o non può essere dichiarata ::size_t
, quindi non puoi fare affidamento sul fatto che sia lì o che sia assente, a meno che non includa specificamente <stddef.h>
o un'altra intestazione dalla libreria C che è garantita per dichiararla.
::size_t
è presente ad esempio in <stddef.h>
, quindi non è sempre necessario qualificarlo std::
.
Da C ++ 03 "Tipi 17.4.3.1.4":
Per ogni tipo T dalla libreria Standard C (nota 169), i tipi :: T e std :: T sono riservati all'implementazione e, quando definiti, :: T devono essere identici a std :: T.
E nota 169:
Questi tipi sono clock_t, div_t, FILE, fpos_t, lconv, ldiv_t, mbstate_t, ptrdiff_t, sig_atomic_t, size_t, time_t, tm, va_list, wctrans_t, wctype_t e wint_t.
std::T
varianti che vengono definite?
#include <stddef.h>
quindi std::size_t
potresti o non essere disponibile. Se sei #include <cstddef>
quindi std::size_t
disponibile, ma size_t
potrebbe non esserlo.
std::
e il paragrafo dice che può anche definirle nello spazio dei nomi di livello superiore e, in caso affermativo, deve definirle in modo identico std::
e di livello superiore. La maggior parte dei compilatori include solo l'intestazione C e importa i nomi std::
, quindi i simboli finiscono per essere definiti in entrambi.
std::
varianti di identificatori che provengono dalla riva C. Rispetto alle <xxxxx.h>
intestazioni C standard: non è mai stato un problema. Così, mi piacerebbe utilizzare <stddef.h>
e size_t
senza mai dare un secondo pensiero a std::size_t
; in realtà, non mi viene mai in mente che esiste (o potrebbe esserci) a std::size_t
.
std :: size_t è infatti stddef.h 's size_t .
cstddef fornisce quanto segue:
#include <stddef.h>
namespace std
{
using ::ptrdiff_t;
using ::size_t;
}
... portando efficacemente la definizione precedente nello spazio dei nomi std.
<cstddef>
e aspettarti di ottenere ::size_t
, ma se includi <stddef.h>
otterrai std::size_t
.
<stddef.h>
ti prenderà solo ::size_t
.
<cstddef>
hai la garanzia di ottenere std::size_t
e potresti anche ottenere ::size_t
(ma non è garantito). Se includi <stddef.h>
hai la garanzia di ottenere ::size_t
e potresti anche ottenere std::size_t
(ma non è garantito). Era diverso in C ++ 03 ma era effettivamente inattuabile e risolto come difetto.