Yanıtlar:
C'ler size_tve C ++ 'lar std::size_taynı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_tnın stdad 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_tolmadan 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_tiç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::Ttanımlanmış değişkenlere dayanmamalıdır?
#include <stddef.h>o zaman std::size_tolabilir veya mevcut olmayabilir. Eğer varsa #include <cstddef>o zaman std::size_tmevcuttur, ancak size_tkudreti 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_tasla 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_tve ayrıca alabilirsiniz ::size_t(ancak garanti edilmez). Eğer dahil <stddef.h>ederseniz alacağınız garanti ::size_tve 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.