Câu trả lời:
C size_t
s và C ++ ' std::size_t
đều giống nhau.
Trong C, nó được định nghĩa trong <stddef.h>
và trong C ++, được định nghĩa trong <cstddef>
đó có nội dung giống với tiêu đề C (xem trích dẫn bên dưới). Nó được định nghĩa là kiểu số nguyên không dấu của kết quả của toán tử sizeof .
Tiêu chuẩn C nói trong §17.7 / 2,
size_t là kiểu số nguyên không dấu của kết quả của toán tử sizeof
Và C ++ Standard cho biết (về cstddef
tiêu đề) trong §18.1 / 3,
Nội dung giống như tiêu đề thư viện C tiêu chuẩn, với các thay đổi sau .
Vì vậy, yeah, cả hai đều giống nhau; sự khác biệt duy nhất là C ++ định nghĩa size_t
trong std
không gian tên.
Cũng xin lưu ý rằng dòng trên cũng nói "với những thay đổi sau" không được đề cập đến size_t
. Nó khá liên quan đến các bổ sung mới (chủ yếu) được tạo bởi C ++ vào ngôn ngữ (không có trong C) cũng được định nghĩa trong cùng một tiêu đề.
Wikipedia có thông tin rất tốt về phạm vi và kích thước lưu trữ của size_t:
Phạm vi và kích thước lưu trữ của size_t
Các thực tế loại size_t là nền tảng phụ thuộc ; một lỗi phổ biến là giả sử size_t giống như int unsign, điều này có thể dẫn đến lỗi lập trình, [3] [4] khi chuyển từ kiến trúc 32 sang 64 bit chẳng hạn.
Theo tiêu chuẩn ISO C năm 1999 (C99), size_t là loại số nguyên không dấu có ít nhất 16 bit.
Và phần còn lại bạn có thể đọc từ trang này tại wikipedia.
size_t
không có using namespace std;
hoặc using std::size_t;
. Tuy nhiên, hầu hết các trình biên dịch cho phép nó và Tiêu chuẩn đặc biệt cho phép họ cho phép nó (§D.5 / 3).
<cstddef>
có thể hoặc không thể khai báo ::size_t
, vì vậy bạn không thể dựa vào nó ở đó hoặc vắng mặt, trừ khi cụ thể bao gồm <stddef.h>
hoặc một tiêu đề khác từ thư viện C được đảm bảo để khai báo.
::size_t
có mặt, ví dụ như trong <stddef.h>
, vì vậy bạn không cần phải luôn luôn đủ điều kiện std::
.
Từ C ++ 03 "17.4.3.1.4 Các loại":
Đối với mỗi loại T từ thư viện C chuẩn (chú thích 169), các loại :: T và std :: T được dành riêng cho việc triển khai và khi được xác định, :: T sẽ giống hệt với std :: T.
Và chú thích 169:
Các loại này là clock_t, div_t, FILE, fpose_t, lconv, ldiv_t, mbstate_t, ptrdiff_t, sig_atomic_t, size_t, time_t, tm, va_list, wctrans_t, wctype_t, và wint.
std::T
biến thể được xác định?
#include <stddef.h>
sau đó std::size_t
có thể hoặc có thể không có sẵn. Nếu bạn #include <cstddef>
sau đó std::size_t
có sẵn, nhưng size_t
có thể không.
std::
và đoạn nói rằng nó cũng có thể định nghĩa chúng trong không gian tên cấp cao nhất và nếu có, nó phải xác định chúng theo std::
cấp độ và cấp cao nhất. Hầu hết các trình biên dịch chỉ bao gồm tiêu đề C và nhập tên vào std::
, vì vậy các ký hiệu cuối cùng được xác định trong cả hai.
std::
biến thể của số nhận dạng đến từ bờ C. Tôi gắn bó với <xxxxx.h>
các tiêu đề C tiêu chuẩn - nó không bao giờ là vấn đề. Vì vậy, tôi muốn sử dụng <stddef.h>
và size_t
và không bao giờ bỏ một ý nghĩ thứ hai để std::size_t
; thật ra, tôi không bao giờ nghĩ rằng có (hoặc có thể) a std::size_t
.
std :: size_t trên thực tế là size_t của stddef.h .
cstddef đưa ra như sau:
#include <stddef.h>
namespace std
{
using ::ptrdiff_t;
using ::size_t;
}
... có hiệu quả đưa định nghĩa trước đó vào không gian tên std.
<cstddef>
và mong đợi để có được ::size_t
, nhưng nếu bạn bao gồm <stddef.h>
bạn sẽ nhận được std::size_t
.
<stddef.h>
sẽ chỉ có được bạn ::size_t
.
<cstddef>
bạn được đảm bảo để có được std::size_t
và bạn cũng có thể nhận được ::size_t
(nhưng nó không được bảo đảm). Nếu bạn bao gồm <stddef.h>
bạn được đảm bảo để có được ::size_t
và bạn cũng có thể nhận được std::size_t
(nhưng nó không được bảo đảm). Nó khác với C ++ 03 nhưng điều đó thực sự không thể thực hiện được và được sửa là một khiếm khuyết.