Tôi đã chuyển sang các loại số nguyên có độ dài cố định trong các dự án của mình chủ yếu là vì chúng giúp tôi suy nghĩ về kích thước số nguyên rõ ràng hơn khi sử dụng chúng. Bao gồm họ qua #include <inttypes.h>
cũng bao gồm một loạt các macro khác như các macro in PRIu32
, PRIu64
...Khi nào tôi nên sử dụng các macro UINT32_C(), INT32_C(), ... trong C?
Để gán một giá trị không đổi cho một biến chiều dài cố định tôi có thể sử dụng các macro như UINT32_C()
và INT32_C()
. Tôi bắt đầu sử dụng chúng bất cứ khi nào tôi gán một giá trị không đổi.
Điều này dẫn đến mã tương tự như sau:
uint64_t i;
for (i = UINT64_C(0); i < UINT64_C(10); i++) { ... }
Bây giờ tôi thấy một số ví dụ mà không quan tâm về điều đó. Một là stdbool.h
bao gồm file:
#define bool _Bool
#define false 0
#define true 1
bool
có kích thước 1 byte trên máy tính của tôi, vì vậy nó không giống như một int
. Nhưng 0
và 1
phải là số nguyên nên được trình biên dịch tự động chuyển thành đúng loại. Nếu tôi sẽ sử dụng trong ví dụ của tôi mã sẽ dễ dàng hơn nhiều để đọc:
uint64_t i;
for (i = 0; i < 10; i++) { ... }
Vì vậy, khi tôi nên sử dụng độ dài cố định liên tục macro như UINT32_C()
và khi nào tôi nên rời bỏ công việc đó để trình biên dịch (tôi sử dụng GCC)? Nếu tôi viết mã trong MISRA C thì sao?
Cá nhân tôi tránh xa việc sử dụng các loại chiều rộng cố định: không phải tất cả trình biên dịch đều hỗ trợ chúng và quy tắc quảng cáo với các loại này thực tế không tồn tại - theo ý kiến khiêm tốn của tôi về sự giám sát lớn trong tiêu chuẩn C. Upvote cho câu hỏi mặc dù. – Bathsheba
Câu hỏi thú vị, không thể chờ đợi để xem câu trả lời – cat
Bạn có thể cần chúng nếu 'int' hẹp hơn 32 bit. – nwellnhof