2009-09-11 28 views

Trả lời

21

Nếu bạn đang sử dụng C99 hoặc mới hơn, bạn nên sử dụng stdint.h cho việc này. uint8_t, trong trường hợp này.

C++ không nhận được tiêu đề này cho đến khi C++ 11, gọi nó là cstdint. Các phiên bản cũ của Visual C++ không cho phép bạn sử dụng mã của C99 stdint.h trong mã C++, nhưng khá nhiều trình biên dịch C++ 98 khác, vì vậy bạn có thể có tùy chọn đó ngay cả khi sử dụng các trình biên dịch cũ.

Giống như rất nhiều thứ khác, Boost giấy tờ về sự khác biệt này trong boost/integer.hpp, cung cấp những thứ như uint8_t nếu thư viện chuẩn C++ của trình biên dịch của bạn không.

2

Cá nhân tôi thích boost::int8_tboost::uint8_t.

Nếu bạn không muốn sử dụng tăng, bạn có thể mượn boost\cstdint.hpp.

Một tùy chọn khác là sử dụng portable version of stdint.h (liên kết từ câu trả lời this).

+9

Tôi không thực sự được bán trên yêu cầu tiêu đề tăng chỉ dành cho typedef. –

+0

Lưu ý rằng trong khi stdint.h được định nghĩa bởi C99, không có yêu cầu theo tiêu chuẩn ISO C++ hiện tại (vì nó có trước C99), vì vậy bạn có thể tìm thấy trong một số trình biên dịch, bạn phải sử dụng quy ước C cho tên tiêu đề. các loại, và đó sẽ là hình thức di động nhất. – Clifford

1

Bên cạnh quy ước đặt tên khó xử của bạn, tôi nghĩ rằng có thể không sao. Hãy ghi nhớ thúc đẩy thực hiện điều này cho bạn, để giúp đỡ với cross-platform-khả năng:

#include <boost/integer.hpp> 

typedef boost::uint8_t byte_t; 

Lưu ý rằng thường gõ của được với hậu tố _t, như trong byte_t.

+0

Các loại bạn xác định KHÔNG được thêm hậu tố "_t" vì các tên như vậy được dành riêng cho các tiện ích mở rộng cho ngôn ngữ và thư viện chuẩn (ví dụ: để thêm uint8_t không chia nhỏ nhiều mã hiện có). – Dipstick

+0

@chrisharris bạn đã tìm thấy thông tin này ở đâu? Tôi đang xem xét một dự thảo của các tiêu chuẩn ISO C++ và không thể tìm thấy phần đó, nhưng tôi có một đồng nghiệp thích làm hậu tố tất cả các mẫu/lớp chức năng của anh ấy theo cách đó và muốn chỉ ra cho anh ta. – stinky472

+0

@ stinky472: Tôi không biết tiêu chuẩn ISO C nói gì về điều này, nhưng ý thức chung cho biết tên tùy chỉnh không nên va chạm với các tên chuẩn, vì vậy để tránh rắc rối thì tốt hơn nên sử dụng 'byte'. Hoặc, nếu đồng nghiệp của bạn thích, hãy sử dụng tiền tố * thay vì hậu tố: 't_byte'. – MestreLion

7

Tôi đề nghị rằng nếu trình biên dịch của bạn hỗ trợ nó sử dụng các loại tiêu đề C99<stdint.h> như uint8_tint8_t.

Nếu trình biên dịch của bạn không hỗ trợ, hãy tạo một trình biên dịch. Here's ví dụ về VC++, các phiên bản cũ hơn không có stdint.h. GCC không hỗ trợ stdint.h, và hầu hết C99

Một vấn đề với đề nghị của bạn là dấu hiệu của char là thực hiện được xác định, vì vậy nếu bạn tạo một loại bí danh. bạn nên ít nhất là rõ ràng về các dấu hiệu. Có một số công đức trong ý tưởng kể từ trong C# ví dụ: char là 16bit. Nhưng nó cũng có một kiểu byte.


lưu ý bổ sung ...

Không có vấn đề với đề nghị của bạn, bạn đã làm trong thực tế chỉ định unsigned.

Tôi cũng khuyên rằng đồng bằng char được sử dụng nếu dữ liệu trong dữ liệu ký tự thực tế, tức là đại diện cho văn bản thuần túy như bạn có thể hiển thị trên bảng điều khiển.Điều này sẽ trình bày ít vấn đề về thỏa thuận loại hơn khi sử dụng thư viện tiêu chuẩn và bên thứ ba. Mặt khác, dữ liệu đại diện cho một thực thể không phải ký tự như bitmap hoặc nếu nó là dữ liệu số nguyên nhỏ mà bạn có thể thực hiện thao tác số học hoặc dữ liệu mà bạn sẽ thực hiện các thao tác logic, sau đó một trong các Các loại stdint.h (hoặc thậm chí một loại được xác định từ một trong số chúng) nên được sử dụng.

tôi gần đây đã bị bắt trên một TI C54xx biên dịch, nơi char là trong thực tế 16bit, vì vậy đó là lý do tại sao sử dụng stdint.h nếu có thể, ngay cả khi bạn sử dụng nó để sau đó xác định một loại byte là thích hợp hơn để giả sử rằng unsigned char là một bí danh phù hợp.

+0

Điểm tốt về ví dụ của tôi, tôi đã đánh dấu câu trả lời của Warren đúng bởi vì anh ấy là người đầu tiên và bài đăng của anh ấy ngắn gọn. Đã bỏ phiếu cho bạn ít nhất ... –

0

Tôi thích sử dụng các loại tiêu chuẩn, unsigned char, uint8_t, v.v., vì vậy bất kỳ lập trình viên nào nhìn vào nguồn không phải tham chiếu lại tiêu đề để băm mã. Các typedefs bạn sử dụng nhiều thời gian hơn cho những người khác để biết về các quy ước đánh máy của bạn. Đối với các cấu trúc, hoàn toàn sử dụng typedef, nhưng đối với các nguyên thủy sử dụng chúng một cách tiết kiệm.

4

Tôi thích các loại để truyền tải ý nghĩa của các giá trị được lưu trữ trong đó. Nếu tôi cần một loại mô tả một byte như nó là trên máy tính của tôi, tôi rất thích byte_t hơn unsigned char, có thể có nghĩa là bất cứ thứ gì. (Tôi đã làm việc trong một cơ sở mã sử dụng hoặc signed char hoặc unsigned char để lưu trữ các chuỗi UTF-8.) Tương tự với uint8_t. Nó chỉ có thể được sử dụng như vậy: một số nguyên không dấu 8 bit.

Với byte_t (giống như bất kỳ loại được đặt tên nào khác), hiếm khi cần tra cứu những gì được xác định (và nếu có, người chỉnh sửa tốt sẽ mất 3 giây để tìm kiếm cho bạn; , nếu cơ sở mã là rất lớn), và chỉ bằng cách nhìn vào nó là rõ ràng những gì được lưu trữ trong các đối tượng của loại đó.

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