2009-12-17 36 views
16

Chỉ cần tò mò nếu u_char là một tiêu chuẩn. Tôi đã luôn luôn sử dụng nó giả định nó đã được xác định cùng với các loại uintX_t và như vậy. Nhưng tôi thấy một số chuyển đổi cơ sở mã của chúng tôi từ u_char thành "unsigned char" với lý do "do đó người dùng không phải tự xác định u_char" ..u_char có phải là tiêu chuẩn không?

+5

u_char không phải là một phần của tiêu chuẩn ANSI C chính thức –

Trả lời

4

Nó không có trong bất kỳ tệp tiêu đề cũ nào , chẳng hạn như Kerberos và các tiêu đề mạng), và không phải là kiểu tích hợp trong bất kỳ trình biên dịch nào mà tôi biết.

12

Chuỗi u_char không xuất hiện trong dự thảo này của tiêu chuẩn C:

http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

Nó không theo yêu cầu của một trong hai POSIX, như xa như tôi biết.

Tôi nghĩ rằng đó là trong BSD (sys/types.h) và Windows (winsock.h). Tôi sẽ không xem xét một trong hai là "một tiêu chuẩn" - họ không phải là tiêu chuẩn chính thức, và họ chắc chắn không phải là một phần của tiêu chuẩn C, nhưng họ được xác định rõ ràng và tài liệu.

+1

Hơn nữa vấn đề sử dụng những loại không chuẩn này là bạn phải rất cẩn thận về việc xác định chúng. Một số hệ thống sẽ có chúng được xác định (sai), dẫn đến lỗi nếu bạn tự định nghĩa chúng, nhưng những người khác sẽ không, nghĩa là bạn không thể sử dụng loại trừ khi bạn tự xác định. Cách an toàn nhất là không sử dụng rác như thế này, không được lười biếng, và viết ra 'unsigned char' khi bạn có nghĩa là nó. –

+0

@R .. hoặc sử dụng '' cho 'uint8_t', ... loại. –

+5

@JonathonReinhart: sử dụng 'uint8_t' có hiệu lực có một xác nhận trong xây dựng rằng' CHAR_BIT == 8', vì loại bị cấm tồn tại nếu 'CHAR_BIT> 8'. Nếu bạn muốn loại 8 bit, nhưng nếu ý bạn là "một loại số nguyên không dấu chiếm một đơn vị lưu trữ trong quá trình thực hiện này, bất kỳ thứ gì có thể là", thì bạn nên nói rằng: 'unsigned char'. –

5

Không, u_char không chuẩn. Nếu bạn cần sử dụng loại tiêu chuẩn tương đương với u_char, bạn có thể sử dụng uint8_t là một phần của thư viện chuẩn C99 (hãy kiểm tra các nền tảng/trình biên dịch cụ thể của bạn để tuân thủ C99). stdint.h xác định loại này (cùng với nhiều loại tích phân cụ thể khác). This Wikipedia article contains more information about stdint.h.

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