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.
Có cờ '-Wconversion', nhưng chỉ được hỗ trợ từ gcc 4.3. –
Đ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
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. –