2009-07-06 27 views
53

Vì tiêu đề: là size_t luôn không được ký, tức là cho size_t x, là x luôn luôn >= 0?là size_t luôn không được ký?

+4

Một số trích dẫn từ tài liệu chuẩn cho tất cả các xác nhận bên dưới sẽ tốt đẹp. –

+4

Nó không phải về kích thước, đó là cách bạn sử dụng nó :) – ralphtheninja

+8

Có "ssize_t" cho "size_t đã ký" :) –

Trả lời

44

. Đó là thường định nghĩa là một cái gì đó như sau (trên 32-bit hệ thống):

typedef unsigned int size_t; 

tham khảo:

C++ Mục Tiêu chuẩn 18.1 định nghĩa size_t là trong <cstddef> được mô tả trong C chuẩn như <stddef.h>.
C Tiêu chuẩn Mục 4.1.5 định nghĩa size_t như một loại không thể thiếu unsigned về kết quả của sizeof hành

+0

@Neil: Tôi biết. Đó là điều đầu tiên tôi tìm thấy. Tôi không có chuẩn C++ trong tay nên tôi đang tải xuống (kết nối của tôi chậm). Trong khi chờ đợi, tôi đặt một cái gì đó khác hơn bản thân mình. –

+0

Vâng, tôi có tiêu chuẩn C++ để tay, nhưng không thể tìm thấy nó, có thể bởi vì nó thực sự được định nghĩa trong tiêu chuẩn C (không phải C99). Tôi hy vọng một người nào đó sẽ theo dõi nó xuống, bởi vì tôi nghĩ rằng đó là một câu hỏi thú vị! –

+0

Hãy lưu ý rằng cplusplus.com có ​​một số trang lạ. Hãy xem điều này, ví dụ: http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/ giờ đây là chữ ký thú vị của toán tử << :) –

14

Có, size_t được đảm bảo là loại không dấu.

46

Theo tiêu chuẩn ISO 1999 C (C99), size_t là một kiểu dữ liệu integer unsigned của ít nhất 16 bit (xem các phần 7.17 và 7.18.3).

Tiêu chuẩn này cũng khuyến cáo rằng size_t không cần phải có một cấp bậc chuyển đổi số nguyên lớn hơn long nếu có thể, tức là đúc size_t để unsigned long là unproblematic nếu đề nghị được theo sau.

Tiêu chuẩn ANSI C 1989 (ANSI C) không đề cập đến kích thước tối thiểu hoặc xếp hạng chuyển đổi được đề xuất.

Chuẩn ISO C++ năm 1998 (C++ 98) (cũng như bản nháp hiện tại cho C++ 0x) đề cập đến tiêu chuẩn C. Mục 18.1 đọc:

Nội dung cũng giống như tiêu đề thư viện chuẩn C <stddef.h> [...]

Theo mục 1.2, điều này có nghĩa thư viện theo quy định của tiêu chuẩn ISO 1990 C (C90), trong đó có sửa đổi đầu tiên từ năm 1995 (C95):

thư viện mô tả trong mục 7 của ISO/IEC 9899: 1990 và khoản 7 ISO/IEC 9899/Amd.1: 1995 là sau đây gọi cuộc gọi chỉnh sửa Thư viện chuẩn C.

Các bộ phận liên quan đến size_t phải được kế thừa từ ANSI C: Mặt trước và phần đánh số sang một bên, các tiêu chuẩn cho C90 và ANSI C giống nhau. Tôi cần một bản sao sửa đổi quy định để chắc chắn rằng không có bất kỳ thay đổi có liên quan nào đối với stddef.h, nhưng tôi nghi ngờ điều đó. Kích thước tối thiểu dường như được giới thiệu với stdint.h, tức là C99.

Vui lòng xem xét báo giá sau từ phần 1.2 của C++ 98:

Tất cả các tiêu chuẩn này tùy thuộc vào phiên bản, và các bên tham gia thỏa thuận dựa trên tiêu chuẩn quốc tế này được khuyến khích nghiên cứu khả năng áp dụng nhiều nhất phiên bản gần đây của các tiêu chuẩn chỉ ra dưới đây.

+0

Thật không may, câu hỏi không phải là về C99 nhưng C++. –

+8

@Neil, anh ta cũng phải lấy tiêu chuẩn C, bởi vì tiêu chuẩn C++ đại diện cho nó :) Nó không tự xác định size_t :) –

+2

Có, nhưng tiêu chuẩn C++ không tham chiếu chuẩn C99. –

5

Theo tiêu chuẩn không được ký, tuy nhiên tôi nhớ lại rằng một số triển khai cũ hơn đã sử dụng loại đã ký cho typedef.

Từ một doc GCC cũ:

Có một vấn đề tiềm năng với kiểu size_t và các phiên bản của GCC trước khi phát hành 2.4. ANSI C yêu cầu size_t luôn là loại không dấu. Để tương thích với các tệp tiêu đề của hệ thống hiện có, GCC định nghĩa size_t trong stddef.h là bất kỳ loại nào hệ thống của sys/types.h xác định. Hầu hết các hệ thống Unix xác định size_t trong sys/types.h, xác định nó là một loại đã ký. Một số mã trong thư viện phụ thuộc vào loại size_t là một loại chưa được ký và sẽ không hoạt động chính xác nếu được ký

Tôi không chắc chắn về cách bảo vệ chống lại điều đó. Mã của tôi giả định nó chưa được ký.

+0

Tôi nghĩ mọi người đều biết nó có thể chưa được ký - nhưng trừ khi ai đó có thể trích dẫn một tài liệu tiêu chuẩn có liên quan, chúng tôi sẽ không bao giờ biết chắc chắn. –

+0

Hiện tại tôi không có tài liệu chuẩn nào (mặc dù tôi tự tin rằng tất cả các tiêu chuẩn liên quan, C90, C99 và C++ 98 trở lên đều yêu cầu nó không được ký). Tuy nhiên, tôi chỉ muốn chỉ ra rằng bất kể tiêu chuẩn, có những ngoại lệ tiềm ẩn quan trọng trong đó size_t là một loại đã ký. –

2

Kích thước_t phải tuân theo định nghĩa tương tự như tiêu chuẩn C, và ở một số nơi trong tiêu chuẩn C++ nó ngụ ý rằng nó chưa được gán natura (đặc biệt trong định nghĩa đối số mẫu cấp phát).

Trên ++ Chuẩn C, phần 18,1 (ISO/IEC 14882 - Đầu phiên bản 1998/01/01):

Bảng 15 liệt kê như các loại định nghĩa: ptrdiff_t và size_t

3 Nội dung đều giống nhau như tiêu đề thư viện chuẩn C, với các thay đổi sau: 4 Macro NULL là hằng số con trỏ null C++ được xác định thực hiện trong tiêu chuẩn này (4.10).

Macro offsetof chấp nhận bộ đối số loại giới hạn trong tiêu chuẩn này. loại phải là cấu trúc POD hoặc liên minh POD (điều 9). Kết quả của việc áp dụng macro offsetof cho một trường mà là một thành viên dữ liệu tĩnh hoặc một thành viên hàm không xác định. C ALNG C :NG: mục 5.3.3, Sizeof, phụ 5.7, Các toán tử phụ gia, điều 12.5, Lưu trữ miễn phí và ISO C trình 7.1.6.

1

Oh, đây chỉ là khủng khiếp:

vector<MyObject> arr; 
Fill(arr); 
size_t size = arr.size(); 
for(size_t i = 1; i < size - 1; ++i) 
{ 
    auto obj = arr[i]; 
    auto next = arr[i+1]; 
} 

Bây giờ chiêm ngưỡng trường hợp sử dụng nơi arr trống.

Các vấn đề liên quan