Có mã này mà biên dịch với Windows SDK:Có sử dụng 0xFFFFFFFF một cách đáng tin cậy để thiết lập tất cả các bit trong một loại 32-bit?
UINT cFiles = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0);
nơi DragQueryFileW()
có chữ ký này:
UINT DragQueryFileW(HDROP, UINT, LPWSTR, UINT);
và UINT
được định nghĩa ở đâu đó trong tiêu đề SDK như thế này:
typedef unsigned int UINT;
cho nền tảng nơi int
chắc chắn là 32 bit. Như thường lệ, các kiểu như UINT
có nghĩa là có chiều rộng cố định độc lập trên bit hệ thống, vì vậy nếu mã tương tự phải được biên dịch lại trên một số nền tảng khác, trong đó DragQueryFileW()
được thực hiện lại bằng cách nào đó cũng sẽ có typedef
tương ứng sẽ tạo bản đồ UINT
một loại không dấu 32 bit phù hợp.
Bây giờ, có một công cụ phân tích tĩnh nhìn vào hằng số 0xFFFFFFFF
và phàn nàn rằng đó là số ma thuật không thể chuyển đổi và one should use -1
instead. Trong khi tất nhiên -1
là tốt và di động Tôi không thể thấy cách sử dụng hằng số 0xFFFFFFFF
có thể là một vấn đề ở đây vì ngay cả khi việc chuyển loại vẫn sẽ là 32-bit và hằng số sẽ ổn.
Đang sử dụng 0xFFFFFFFF
thay vì -1
để đặt tất cả các bit an toàn và di động trong trường hợp này?
Có thể phân tích tĩnh phàn nàn, bởi vì nó có thể không lo lắng về việc 32-bit hoặc 64-bit. – iammilind
Âm thanh như dương tính giả trong công cụ phân tích tĩnh. Có thể không thấy rằng bạn luôn sử dụng hằng số đó trong ngữ cảnh 32 bit. –
Sử dụng '~ 0u' để thay thế. – ybungalobill