sau đây C++ mã không biên dịch:Tại sao iostream định nghĩa hàm abs và làm thế nào tôi có thể dừng nó?
int main() {
double a = abs(5.1);
return 0;
}
Nó phàn nàn rằng abs
không được định nghĩa, tất nhiên. Nhưng những điều sau đây không biên dịch:
#include <iostream>
int main() {
std::cout << abs(5.1) << std::endl;
std::cout << abs(-5.1) << std::endl;
return 0;
}
Kết quả là hai 5 (không phải là 5.1). Điều này là xấu vì nhiều lý do. Đầu tiên, abs
là một chức năng tự nhiên và phổ biến mà tôi sử dụng nó mọi lúc, nhưng phần int
hầu như không bao giờ là thứ tôi muốn trả về. Thứ hai, nó quá dễ dàng đối với tôi (hoặc người sử dụng mã của tôi) chỉ cần viết abs
và không nhận thấy rằng nó biên dịch nhưng làm điều sai trái, bởi vì tôi (họ) thực sự giỏi trong việc xem cảnh báo. Thứ ba, tôi chỉ đơn giản là không hiểu tại sao iostream làm phiền định nghĩa một hàm abs
. Thứ tư, tôi thực sự không hiểu lý do tại sao nó đi vào không gian tên chung.
Có cách nào tôi có thể ngăn chặn chức năng abs
có thể bị phản đối này xâm nhập vào không gian tên chung của tôi không?
Nếu vấn đề, tôi đang sử dụng
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.6)
Điều này có thể là do ' 'là' # include'-ing '' đằng sau hậu trường. –
Điều này không nên biên dịch. Không nên có hàm 'abs' trong không gian tên chung khi bạn bao gồm' '(không biên dịch trong g ++ 4.6.2 và http://ideone.com/QP6cj). –
Zeta
@ Zeta - nó * không * biên dịch và nhập 'abs' vào không gian tên chung bằng trình biên dịch và hệ điều hành mà anh ta có, tôi đã thử nghiệm để đảm bảo. Đó là Xcode hiện tại của Apple, vì vậy việc nâng cấp không đơn giản. –