2012-12-06 20 views
10

thể trùng lặp:
g++ -Wall not warning about double-> int castg ++ cảnh báo khi đôi/float được chuyển thành số nguyên unsigned mà không sử dụng -Wconversion

mỗi câu hỏi here, chuyển đổi trực tiếp từ đôi/phao để unsigned integer không di động. Tôi tìm thấy tôi đã có một vài trường hợp trong mã của tôi, nơi điều này xảy ra và tôi muốn nói với g + + để cảnh báo tôi nếu điều này xảy ra, nhưng tôi không thể tìm thấy một tùy chọn như vậy. Có ai biết nếu có một lựa chọn để làm điều này?

Lưu ý: Tôi thấy -Wversionversion, nhưng điều đó cũng cảnh báo về tất cả các loại chuyển đổi khác mà tôi không quan tâm (như chuyển int sang unsigned int, di động theo tiêu chuẩn).

Edit: Đây là một ví dụ mã mà tôi muốn thấy cảnh báo:

double dblNumber = -234; 
unsigned long uintNumber = dblNumber; 

Một phiên bản của g ++, việc này mang lại cho tôi một giá trị số nguyên của 0xFFFFFF16 (đó là -234 trong bổ sung 2 của) . Ngày khác nó cho tôi 0. Rõ ràng mã là mơ hồ, đó là lý do tại sao nó là dễ hiểu không được coi là di động.

+0

@djechlin: * "Lưu ý: Tôi thấy -Wconversion, nhưng cũng cảnh báo về tất cả các loại chuyển đổi khác mà tôi không quan tâm (như chuyển int sang unsigned int, di động theo chuẩn)." *. – Zeta

+0

Tôi thừa nhận tôi không thấy câu hỏi khác, nhưng nó không thực sự địa chỉ không sử dụng -Wconversion. Nó có vẻ kỳ lạ mà tôi không cảnh báo về điều này theo mặc định, đặc biệt là kể từ khi các phiên bản khác nhau của g + + phản ứng khác nhau gây ra một số triển khai để âm thầm thất bại. – KyleL

+0

@KdawgUD Bạn có thể hiển thị một đoạn mã ví dụ không? Không chắc chắn chính xác bạn thực hiện chuyển đổi như thế nào.Bất cứ khi nào bạn cast một cách rõ ràng từ một loại khác, ví dụ 'un_signed_int_value = (unsigned int) double_value;' bạn đang nói với trình biên dịch * Tôi biết những gì tôi đang làm *. Vì vậy, tôi không thấy lý do tại sao trình biên dịch sẽ cảnh báo về các chuyển đổi như vậy. Trong thực tế, các diễn viên rõ ràng sẽ ngăn chặn bất kỳ cảnh báo nếu có một. Trừ khi tôi hiểu lầm câu hỏi của bạn, điều bạn đang yêu cầu là không thể. –

Trả lời

1

Khi thực hiện float to int chuyển đổi ẩn và giá trị cắt ngắn không thể phù hợp với loại đích, thì hành vi không xác định, như ví dụ của bạn minh họa rõ ràng.

Nếu công cụ duy nhất được cung cấp bởi g ++ là -Wconversion, có lẽ bạn nên làm công cụ của riêng bạn để lọc những lời cảnh báo ra để thuận tiện cho bạn (Tôi đang nghĩ thông thường sed, awk, perl hoặc php, nhưng nó phụ thuộc vào sự sẵn có của những công cụ này trên hệ thống của bạn và có thể bạn có thể làm điều gì đó tương tự trực tiếp từ IDE của mình nếu bạn sử dụng nó).

Bạn cũng có thể sử dụng specific pragma directives của gcc để hạn chế kiểm tra chuyển đổi đối với các tệp cụ thể hoặc thậm chí là các phần mã cụ thể.

Bất kỳ phương pháp lập trình nào khác được sử dụng để xác định mã của bạn, nơi chuyển đổi có vấn đề xảy ra chắc chắn có thể được sử dụng để chèn phôi rõ ràng, đó là mục tiêu bạn nên nhắm đến.

4

Tôi biết bạn đã nói bạn không muốn sử dụng -Wconversion nhưng cảnh báo về vấn đề bạn quan tâm và ít nhất trong g ++ 4.5 không cảnh báo khi chuyển đổi long thành unsigned long (ví dụ). Đối với bất kỳ trường hợp nào khác, cảnh báo nơi bạn đang thực hiện chuyển đổi mong muốn hợp pháp, chỉ cần truyền số điện thoại. Những người bảo trì trong tương lai của bạn sẽ cảm ơn bạn rất nhiều vì đã làm rõ rằng một chuyển đổi đã biết đang được thực hiện thay vì đoán xem nó có chủ ý hay không từ ngữ cảnh mã.

+0

Tôi 100% đồng ý rằng chuyển đổi rõ ràng là tốt hơn. Tôi chỉ hy vọng tìm ra cách để thiết lập hệ thống xây dựng của mình sao cho nếu tôi thực hiện một cú pháp ẩn kép để chuyển đổi không dấu thì nó sẽ không trượt qua các vết nứt và không được chú ý. Đối với dự án của tôi, các cảnh báo được tạo ra bởi -Wconversion quá nhiều để có ích, thật không may. – KyleL

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