Odpowiedzi:
C size_t
i C ++ std::size_t
są takie same.
W C jest zdefiniowany w <stddef.h>
C ++ iw C ++, jego <cstddef>
zawartość jest taka sama jak nagłówek C (zobacz cytat poniżej). Jest określona jako unsigned całkowitą w związku z sizeof operatora.
C Standard mówi w §17.7 / 2,
size_t który jest unsigned całkowitą od wyniku tego sizeof operatora
A C ++ Standard mówi (o cstddef
nagłówku) w §18.1 / 3,
Zawartość jest taka sama, jak nagłówek standardowej biblioteki C, z następującymi zmianami .
Więc tak, oba są takie same; Jedyną różnicą jest to, który definiuje c ++ size_t
w std
przestrzeni nazw.
Proszę również zauważyć, że powyższa linia mówi również „z następującymi zmianami”, co nie dotyczy size_t
. Odnosi się raczej do nowych dodatków (głównie) wprowadzonych przez C ++ do języka (nieobecnych w C), które również są zdefiniowane w tym samym nagłówku.
Wikipedia ma bardzo dobre informacje na temat zakresu i rozmiaru magazynu size_t:
Zakres i wielkość składowania size_t
Rzeczywisty typ size_t jest zależne od platformy ; wspólny błąd jest założenie size_t jest taka sama jak unsigned int, co może prowadzić do błędów oprogramowania, [3], [4], podczas przemieszczania się z 32 do 64 bitów architektury, na przykład.
Zgodnie z normą ISO C (C99) z 1999 r., Size_t jest liczbą całkowitą bez znaku o długości co najmniej 16 bitów.
A resztę możesz przeczytać na tej stronie w Wikipedii.
size_t
bez using namespace std;
lub using std::size_t;
. Jednak większość kompilatorów na to zezwala, a Standard wyraźnie zezwala im na to (§D.5 / 3).
<cstddef>
może ::size_t
, ale nie musi, deklarować , więc nie można polegać na tym, że jest obecny lub nieobecny, chyba że wyraźnie zawiera <stddef.h>
lub inny nagłówek z biblioteki C, która gwarantuje, że go zadeklaruje.
::size_t
jest obecny np. w <stddef.h>
, więc nie zawsze musisz go kwalifikować std::
.
Z C ++ 03 „17.4.3.1.4 Typy”:
Dla każdego typu T z biblioteki Standard C (przypis 169) typy :: T i std :: T są zarezerwowane dla implementacji, a po zdefiniowaniu :: T powinny być identyczne z std :: T.
I przypis 169:
Te typy to 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 i wint_t.
std::T
definiowanych wariantach?
#include <stddef.h>
wtedy możesz std::size_t
lub nie być dostępny. Jeśli #include <cstddef>
wtedy jesteś std::size_t
dostępny, ale size_t
może nie być.
std::
a akapit mówi, że może również definiować je w przestrzeni nazw najwyższego poziomu, a jeśli tak, musi zdefiniować je identycznie na std::
najwyższym poziomie. Większość kompilatorów po prostu dołącza nagłówek C i importuje nazwy do std::
, więc symbole są zdefiniowane w obu.
std::
wariantami identyfikatorów, które pochodzą z brzegu C. Trzymam <xxxxx.h>
się standardowych nagłówków C - to nigdy nie był problem. Tak, będę używać <stddef.h>
i size_t
nigdy nie dać namysłu do std::size_t
; w rzeczywistości nigdy nie przychodzi mi do głowy, że istnieje (lub może być) a std::size_t
.
std :: size_t jest w rzeczywistości stddef.h „s size_t .
cstddef daje następujące informacje:
#include <stddef.h>
namespace std
{
using ::ptrdiff_t;
using ::size_t;
}
... skutecznie przenosi poprzednią definicję do przestrzeni nazw standardowej.
<cstddef>
i oczekiwać, że otrzymasz ::size_t
, ale jeśli to <stddef.h>
zrobisz, dostaniesz std::size_t
.
<stddef.h>
tylko cię dostanie ::size_t
.
<cstddef>
masz gwarancję otrzymania std::size_t
i możesz również otrzymać ::size_t
(ale nie jest to gwarantowane). Jeśli dołączysz <stddef.h>
, masz gwarancję, że otrzymasz ::size_t
i możesz również dostać std::size_t
(ale nie jest to gwarantowane). W C ++ 03 było inaczej, ale faktycznie było to niemożliwe do zaimplementowania i naprawione jako usterka.