Chúng tôi đã có một lỗi trong mã của chúng tôi đến từ các dòngC++: cần cảnh báo cho: unsigned int i = -1;
unsigned int i = -1;
Khi mã ban đầu được viết, được là i = 0
và do đó chính xác. Sử dụng -Wall -Wextra
, tôi hơi ngạc nhiên khi gcc không cảnh báo tôi ở đây vì -1 không phù hợp với int không dấu.
Chỉ khi bật -Wsign-conversion
dòng này sẽ trở thành cảnh báo - nhưng với nhiều sai sót tích cực. Tôi đang sử dụng thư viện của bên thứ ba thực hiện các hoạt động giống như mảng với int đã ký (mặc dù chúng không thể là < 0), vì vậy bất cứ khi nào tôi kết hợp nó với ví dụ: vector, tôi nhận được cảnh báo - và tôi không thấy điểm trong việc thêm hàng triệu phôi (và ngay cả tiêu đề của bên thứ ba cũng tạo ra nhiều cảnh báo). Vì vậy, nó là quá nhiều cảnh báo đối với tôi. Tất cả những cảnh báo này là việc chuyển đổi "có thể thay đổi dấu hiệu". Đó là tốt bởi vì tôi biết nó không có trong hầu như tất cả các trường hợp.
Nhưng với nhiệm vụ được đề cập ở trên, tôi nhận được cảnh báo "có thể thay đổi" giống nhau. Không nên là "Chắc chắn sẽ thay đổi dấu hiệu!" thay vì "có thể thay đổi"? Có cách nào để phát ra cảnh báo chỉ cho những trường hợp "sẽ thay đổi", không cho các trường hợp có thể?
Ngay cả thay đổi dấu hiệu nhất định thường được sử dụng cố ý. Ví dụ, 'std :: string' có' static const size_type npos = -1; '. – interjay
[-1 được sử dụng với các loại chưa ký] (http: // stackoverflow.com/q/22801069/1708801) vì kết quả của nó được xác định rõ bởi tiêu chuẩn. –
sử dụng unsigned để đảm bảo biến không phải là tiêu cực là một sai lầm khác: D –