Yanıtlar:
C'ler size_t
ve C ++ 'lar std::size_t
aynıdır.
C'de, içeriği C başlığıyla aynı olan <stddef.h>
C ++ 'da ve C ++' da tanımlanır <cstddef>
(aşağıdaki alıntıya bakın). Onun olarak tanımlanan işaretsiz tamsayı türü bir sonucu ve sizeof operatörü.
C Standardı §17.7 / 2'de diyor,
size_t işaretsiz bir tamsayı tipi bir sonucu arasında sizeof operatörü
Ve C ++ Standardı cstddef
§18.1 / 3'te ( başlık hakkında ) diyor ,
İçerik , aşağıdaki değişikliklerle Standart C kitaplığı üstbilgisiyle aynıdır .
Yani evet, ikisi de aynı; tek fark, C ++ ' size_t
nın std
ad alanında tanımlamasıdır .
Ayrıca, yukarıdaki satırda ayrıca "aşağıdaki değişikliklerle" ifadesi bulunmadığını da belirtin size_t
. Daha çok C ++ tarafından aynı başlıkta da tanımlanan dile (C'de bulunmayan) yapılan yeni eklemelere atıfta bulunur.
Wikipedia, size_t'ın aralık ve depolama boyutu hakkında çok iyi bilgiye sahiptir:
Size_t aralığı ve depolama boyutu
Gerçek size_t türüdür platforma göre ; bir ortak bir hata , size_t programlama hatalara yol açabilir, işaretsiz int olarak olduğunu varsaymak [3] [4], örneğin, 64-bit mimarisi 32'den geçerken.
1999 ISO C standardına (C99) göre, size_t en az 16 bitlik işaretsiz bir tam sayı türüdür.
Ve geri kalanını wikipedia'da bu sayfadan okuyabilirsiniz .
size_t
olmadan söylemek bir hatadır . Bununla birlikte, çoğu derleyici buna izin verir ve Standart özellikle izin verir (§D.5 / 3). using namespace std;
using std::size_t;
<cstddef>
bildirilebilir veya bildirilmeyebilir ::size_t
, bu nedenle, özel olarak <stddef.h>
C kütüphanesinden bildirilmesi garanti edilen başka bir üstbilgi içermedikçe, orada olmasına veya yokluğuna güvenemezsiniz .
::size_t
içinde var <stddef.h>
, yani her zaman kalifiye olmana gerek yok std::
.
C ++ 03 "17.4.3.1.4 Türlerinden":
Standart C kütüphanesindeki her tip T için (dipnot 169), :: T ve std :: T tipleri uygulamaya ayrılmıştır ve tanımlandığında :: T, std :: T ile aynı olacaktır.
Ve dipnot 169:
Bu türler 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 ve wint_t şeklindedir.
std::T
tanımlanmış değişkenlere dayanmamalıdır?
#include <stddef.h>
o zaman std::size_t
olabilir veya mevcut olmayabilir. Eğer varsa #include <cstddef>
o zaman std::size_t
mevcuttur, ancak size_t
kudreti olamaz.
std::
ve paragraf, üst düzey ad alanında da tanımlayabileceğini ve eğer varsa, bunları aynı std::
ve üst düzey olarak tanımlaması gerektiğini söylüyor . Çoğu derleyici sadece C üstbilgisini içerir ve adları std::
içeri aktarır, böylece semboller her ikisinde de tanımlanır.
std::
C sahilinden gelen tanımlayıcıların varyantları ile uğraşmam . <xxxxx.h>
Standart C başlıkları için sadık kalıyorum - bu hiç sorun olmadı. Bu yüzden, ikinci bir düşünce kullanırdım <stddef.h>
ve size_t
asla std::size_t
; aslında, aklıma asla geçmez std::size_t
.
std :: size_t aslında stddef.h 's size_t ' dir .
cstddef aşağıdakileri verir:
#include <stddef.h>
namespace std
{
using ::ptrdiff_t;
using ::size_t;
}
... önceki tanımı etkin bir şekilde std ad alanına getiriyor.
<cstddef>
ve almayı bekleyemezsiniz ::size_t
, ancak eklerseniz <stddef.h>
alırsınız std::size_t
.
<stddef.h>
sadece seni alacak ::size_t
.
<cstddef>
almak için garantilidir std::size_t
ve ayrıca alabilirsiniz ::size_t
(ancak garanti edilmez). Eğer dahil <stddef.h>
ederseniz alacağınız garanti ::size_t
ve ayrıca alabilirsiniz std::size_t
(ancak garanti edilmez). C ++ 03'te farklıydı, ancak etkili bir şekilde uygulanamaz ve bir kusur olarak düzeltildi.