La siguiente C++ no se compila:¿Por qué iostream define una función abs y cómo puedo detenerla?
int main() {
double a = abs(5.1);
return 0;
}
Se queja de que abs
no está definido, por supuesto. Pero el siguiente compila:
#include <iostream>
int main() {
std::cout << abs(5.1) << std::endl;
std::cout << abs(-5.1) << std::endl;
return 0;
}
Emite dos 5 (no 5.1). Esto es malo por muchas razones. En primer lugar, abs
es una función tan natural y común que la utilizo todo el tiempo, pero la parte int
casi nunca es lo que deseo devolver. En segundo lugar, es demasiado fácil para mí (o para las personas que usan mi código) escribir abs
y no darme cuenta de que compila, pero hace lo incorrecto, porque soy (son) realmente buenos para pasar por alto las advertencias. En tercer lugar, simplemente no entiendo por qué iostream molesta la definición de una función abs
de todos modos. En cuarto lugar, I realmente no entiendo por qué entra en el espacio de nombres global.
¿Hay alguna manera de evitar que esta objetable función abs
entre en mi espacio de nombres global?
si importa, estoy usando
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.6)
Esto es probablemente porque '' es '# include'-ing' 'detrás de escena. –
Esto no debería compilarse. No debería haber una función 'abs' en el espacio de nombres global cuando se incluye' '(no se compila en g ++ 4.6.2 y http://ideone.com/QP6cj). –
Zeta
@Zeta - it * does * compila e importa 'abs' al espacio de nombres global utilizando el compilador y el sistema operativo que tiene, lo probé para estar seguro. Ese es el Xcode actual de Apple, por lo que la actualización no es sencilla. –