2013-05-22 31 views
7

Xét đoạn mã sau:Tại sao không clang hoặc gcc cờ này chuyển đổi tiềm ẩn từ đôi để int?

void f(int x) 
{ 
    std::cout << x << std::endl; 
} 

int main() 
{ 
    double x = 1.5; 
    f(x); 
    return 0; 
} 

này biên dịch và chạy mà không cần bất kỳ cảnh báo (sử dụng Wall), và do đó giấu một diễn viên tiềm ẩn nguy hiểm từ hai đến int. Trình biên dịch sẽ thu thập các diễn viên nếu chức năng được gọi với một chữ, tức là

f(1.5) 

nhưng điều này không phải là tất cả những gì hữu ích. Tại sao những trình biên dịch này không đưa ra cảnh báo cho dàn diễn viên này? Tôi đang sử dụng OSX 10.8.3 với gcc-4.2.1 và clang-425.0.28.

+2

Có cờ '-Wconversion', nhưng chỉ được hỗ trợ từ gcc 4.3. –

+0

Điều đó thực sự hiệu quả (theo tiếng kêu) - tại sao lá cờ đó không được bao gồm trong -Wall? – giogadi

+0

Nó có thể tạo cảnh báo cho mã hợp lệ và có rất nhiều mã ở đó sử dụng chuyển đổi tiềm ẩn. –

Trả lời

9

Đối với hậu thế:

Để tránh chuyển đổi ngầm, hãy sử dụng cờ -Wconversion (không được bao gồm trong -Wall). Clang thực sự bao gồm -Wconversion trong cờ -Weverything, nhưng lá cờ này cho phép cảnh báo khá nhiều hơn một chút so với hầu hết người dùng quen với.

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