2013-07-16 61 views
9

Tôi googled cho điều này, và đã ngạc nhiên khi thấy không có hướng dẫn, quy tắc của ngón tay cái, phong cách, vv Khi tuyên bố một (đã ký hoặc không ký) số nguyên trong C, người ta có thể làm cho sự lựa chọn để chỉ sử dụng bất cứ điều gì bộ xử lý định nghĩa cho int hoặc có thể chỉ định chiều rộng (ví dụ: uint16_t, int8_t, uint32_t, v.v ...).Để kích cỡ (u) ints của bạn hay không?

Khi thực hiện các chương trình C dành cho máy tính để bàn/chuyên dụng, tôi đã hướng đến "chỉ sử dụng mặc định" trừ khi điều đó thực sự quan trọng đối với tôi để chỉ định chiều rộng (ví dụ: "đây là ID 32 bit").

Sau khi thực hiện nhiều công việc vi điều khiển gần đây (pic18 và AVR), tôi đã có xu hướng thay đổi mọi thứ, chỉ vì bạn trở nên lương tâm không gian.

Và bây giờ tôi đang làm việc trên một số mã Pic32 (không có hệ điều hành), nơi tôi thấy mình bị rách giữa hai thái cực.

Tôi tò mò những gì rubric (nếu có) người đã xây dựng để giúp họ quyết định khi nào để kích thước ints của họ, và khi sử dụng mặc định? Và tại sao?

+1

Khi viết phần mềm không ném, tôi có xu hướng sử dụng các loại 'uint_least32_t' vv trừ khi tôi cần kích thước cụ thể. Điều đó cho phép tôi chắc chắn về kích thước tối thiểu và cho phép trình biên dịch tối ưu hóa cho kích thước lớn hơn tiếp theo. –

+3

Câu hỏi này đang thu hút ý kiến.Thông thường, tôi dự trữ các số nguyên có kích thước cho các kiểu dữ liệu đang được truyền trên mạng hoặc được lưu trữ trên đĩa và có thể được đọc bởi một chương trình khác sau này. – jxh

+0

@jxh Tôi làm theo cùng một thực tế. Nếu đó là kiểu dữ liệu chỉ dành cho tiêu thụ nội bộ của một cá thể độc lập (tức là, không phân phối) của quy trình xác định loại dữ liệu, tôi cho phép trình biên dịch chọn ý kiến ​​của nó về "kích thước tốt nhất" cho loại đó. Đối với bất cứ điều gì mà rời khỏi quá trình (hoặc cho lưu trữ liên tục hoặc cho truyền thông liên ngành), tôi muốn được rõ ràng trong việc định kích thước dữ liệu. Bạn vẫn có thể phải nhận thức được các vấn đề về tính cuối cùng, nhưng ít nhất kích thước dữ liệu có thể dự đoán được. –

Trả lời

6

Nếu điều gì đó quan trọng đối với bạn, hãy cố gắng làm cho điều đó càng rõ ràng càng tốt.
Nếu bạn không thực sự quan tâm, hãy để trình biên dịch quyết định.

Điều này khá gần với những gì bạn đã tự viết. Nếu bạn phải tuân theo một đặc điểm kỹ thuật, điều đó nói rằng một cái gì đó là 32bit, sử dụng một loại có kích thước. Nếu đó chỉ là bộ đếm vòng lặp, hãy sử dụng int.

2

Thực sự có một hướng dẫn đề cập đến điều này. MISRA C có quy tắc cho biết bạn nên luôn sử dụng các loại có kích thước. Nhưng quy tắc chỉ là tư vấn, không bắt buộc hoặc bắt buộc để tuân thủ.

Từ here:

6,3 (adv): 'typedefs' mà chỉ ra kích thước và signedness nên được sử dụng thay cho các loại cơ bản.

2

Bạn nên sử dụng cả hai.

Quy tắc Misra là tốt, nhưng không phù hợp ở mọi nơi.

Để sử dụng loại có kích thước thì tốt hơn cho việc biên dịch chéo, như mô phỏng của phần mềm được nhúng ở nền tảng máy tính.

Nhưng ngay cả khi đó bạn cần phải liên quan đến printf kích thước đối với các loại có kích thước.

uint32_t val; 

printf("%d", val); 
printf("%ld", (long)val); 

Các printf tác phẩm đầu tiên trên nhiều nền tảng 32bit, nhưng không thành công trên nhiều nền tảng nhúng với int = 16bit/dài = 32bit.

uint16_t len = strlen("text"); 

có thể tạo ra các cảnh báo, như kiểu trả về của strlen là intint thể lớn hơn uint16_t, ở đây nó là tốt hơn để sử dụng int len.