2015-11-23 31 views
11

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ể?

+1

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

[-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. –

+0

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 –

Trả lời

5

Khởi tạo nó với dấu ngoặc nhọn:

unsigned int i{-1}; 

đầu ra GCC:

main.cpp:3:22: error: narrowing conversion of '-1' 
from 'int' to 'unsigned int' inside { } [-Wnarrowing] 
    unsigned int i{-1};

Lưu ý rằng nó không phải lúc nào gây ra lỗi, nó có thể là một cảnh báo hoặc bị vô hiệu hóa hoàn toàn. Bạn nên thử nó với toolchain thực tế của bạn.

+0

Vui lòng cung cấp cờ tổng hợp để cải thiện câu trả lời của bạn. – YSC

+1

@YSC Đó là lỗi, vì vậy, bất kỳ cờ nào cũng sẽ làm :) – Quentin

+1

Đó là [không đúng định dạng và không bắt buộc phải là lỗi] (http://stackoverflow.com/a/31685448/1708801) –

1

Nhưng với nhiệm vụ được đề cập ở trên, tôi nhận được cùng một cảnh báo "có thể thay đổi". Không nên là "Chắc chắn sẽ thay đổi dấu hiệu!" thay vì "có thể thay đổi"?

Thật kỳ quặc. Tôi đã thử nghiệm một vài phiên bản của gcc trong khoảng (4,6-5,2) và họ đã đưa ra một cảnh báo khác nhau cho unsigned int i = -1;

cảnh báo: số nguyên âm ngầm chuyển đổi sang loại unsigned [-Wsign chuyển đổi]

Điều đó nói rằng, họ đang thực sự kiểm soát bởi các tùy chọn tương tự như có thể thay đổi dấu cảnh báo, vì vậy ...

có cách nào để phát ra cảnh báo chỉ dành cho những "sẽ thay đổi" trường hợp, không cho có thể các trường hợp?

Theo tôi biết, điều đó là không thể. Tôi chắc chắn nó sẽ có thể thực hiện trong trình biên dịch, vì vậy nếu bạn muốn có một tùy chọn riêng biệt để cho phép cảnh báo gán một số âm - được biết tại thời gian biên dịch - với biến chưa ký, thì bạn có thể gửi yêu cầu tính năng. Tuy nhiên, vì việc gán -1 cho biến chưa ký là một điều phổ biến và thường hoàn toàn hợp lệ để làm, tôi nghi ngờ tính năng như vậy sẽ được coi là rất quan trọng.

+0

Ok, cảm ơn câu trả lời. Thật vậy, văn bản cảnh báo IS khác nhau. Tôi chỉ đang nhìn vào dòng sai giữa tất cả các cảnh báo "có thể" khác. Sau đó, có vẻ như giải pháp ưa thích của tôi là sử dụng ngày càng nhiều 'biến' tự động. – Raubtier

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