Apa perbedaan antara size_t
dan std::size_t
dalam hal di mana mereka dideklarasikan, kapan harus digunakan dan fitur pembeda lainnya?
Apa perbedaan antara size_t
dan std::size_t
dalam hal di mana mereka dideklarasikan, kapan harus digunakan dan fitur pembeda lainnya?
Jawaban:
C size_t
dan C ++ std::size_t
keduanya sama.
Di C, itu didefinisikan dalam <stddef.h>
dan di C ++, itu didefinisikan <cstddef>
yang isinya sama dengan header C (lihat kutipan di bawah). Its didefinisikan sebagai tipe unsigned integer dari hasil dari sizeof operator.
C Standard mengatakan dalam §17.7 / 2,
size_t yang merupakan tipe integer unsigned dari hasil dari sizeof Operator
Dan C ++ Standard mengatakan (tentang cstddef
header) di §18.1 / 3,
Kontennya sama dengan header pustaka C Standar, dengan perubahan berikut ini .
Jadi ya, keduanya sama; satu-satunya perbedaan adalah bahwa C ++ mendefinisikan size_t
di std
namespace.
Harap perhatikan juga bahwa baris di atas juga mengatakan "dengan perubahan berikut" yang tidak mengacu pada size_t
. Ini lebih mengacu pada penambahan baru (kebanyakan) yang dibuat oleh C ++ ke dalam bahasa (tidak ada di C) yang juga didefinisikan di header yang sama.
Wikipedia memiliki info yang sangat bagus tentang jangkauan dan ukuran penyimpanan size_t:
Rentang dan ukuran penyimpanan size_t
The aktual jenis size_t adalah tergantung platform ; sebuah kesalahan umum adalah dengan mengasumsikan size_t adalah sama dengan int unsigned, yang dapat menyebabkan kesalahan pemrograman, [3] [4] ketika bergerak dari 32 ke arsitektur 64-bit, misalnya.
Menurut standar ISO C 1999 (C99), size_t adalah jenis bilangan bulat unsigned setidaknya 16 bit.
Dan selebihnya Anda dapat membaca dari halaman ini di wikipedia.
size_t
tanpa using namespace std;
atau using std::size_t;
. Namun, sebagian besar kompiler mengizinkannya, dan Standar secara khusus mengizinkan mereka untuk mengizinkannya (§D.5 / 3).
<cstddef>
mungkin atau mungkin tidak mendeklarasikan ::size_t
, jadi Anda tidak bisa mengandalkannya ada atau tidak ada, kecuali secara khusus menyertakan <stddef.h>
atau header lain dari pustaka C yang dijamin untuk mendeklarasikannya.
::size_t
ada misalnya di <stddef.h>
, jadi Anda tidak selalu perlu membuatnya memenuhi syarat std::
.
Dari C ++ 03 "17.4.3.1.4 Jenis":
Untuk setiap tipe T dari pustaka C Standar (catatan kaki 169), tipe :: T dan std :: T dicadangkan untuk implementasi dan, bila ditentukan, :: T harus identik dengan std :: T.
Dan catatan kaki 169:
Jenis ini adalah 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, dan wint_t.
std::T
varian yang ditentukan?
#include <stddef.h>
kemudian std::size_t
mungkin atau mungkin tidak tersedia. Jika Anda #include <cstddef>
kemudian std::size_t
tersedia, tetapi size_t
mungkin tidak.
std::
dan paragraf mengatakan bahwa ia juga dapat mendefinisikannya di namespace tingkat atas dan jika ya, ia harus mendefinisikannya secara identik di dalam std::
dan tingkat atas. Sebagian besar kompiler hanya menyertakan header C dan mengimpor nama ke std::
, sehingga simbol akhirnya ditentukan di keduanya.
std::
varian pengenal yang berasal dari pantai C. Saya tetap menggunakan <xxxxx.h>
untuk header C standar - itu tidak pernah menjadi masalah. Jadi, saya akan menggunakan <stddef.h>
dan size_t
dan tidak pernah berpikir dua kali untuk std::size_t
; pada kenyataannya, tidak pernah terlintas dalam pikiran saya bahwa ada (atau mungkin) a std::size_t
.
std :: size_t sebenarnya stddef.h 's size_t .
cstddef memberikan yang berikut:
#include <stddef.h>
namespace std
{
using ::ptrdiff_t;
using ::size_t;
}
... secara efektif membawa definisi sebelumnya ke namespace std.
<cstddef>
dan mengharapkan untuk mendapatkan ::size_t
, tetapi jika Anda memasukkan <stddef.h>
Anda akan mendapatkan std::size_t
.
<stddef.h>
hanya akan membuatmu ::size_t
.
<cstddef>
Anda dijamin untuk mendapatkan std::size_t
dan Anda mungkin juga mendapatkan ::size_t
(tapi itu tidak dijamin). Jika Anda memasukkan <stddef.h>
Anda dijamin akan mendapatkan ::size_t
dan Anda mungkin juga mendapatkan std::size_t
(tapi itu tidak dijamin). Itu berbeda di C ++ 03 tetapi itu secara efektif tidak dapat diterapkan dan diperbaiki sebagai cacat.