以下 C++ 代码无法编译:
int main() {
double a = abs(5.1);
return 0;
}
它抱怨说abs
当然,没有定义。但以下内容确实可以编译:
#include <iostream>
int main() {
std::cout << abs(5.1) << std::endl;
std::cout << abs(-5.1) << std::endl;
return 0;
}
它输出两个 5(不是 5.1)。这很糟糕,原因有很多。第一的,abs
这是一个非常自然和常见的功能,我一直在使用它,但是int
部分几乎从来都不是我想要返回的。其次,对于我(或使用我的代码的人)来说,编写代码太容易了abs
并没有注意到它编译但做了错误的事情,因为我(他们)真的很擅长忽略警告。第三,我只是不明白为什么 iostream 需要定义一个abs
无论如何都能发挥作用。四、我really不明白为什么它进入全局名称空间。
有什么办法可以阻止这种令人反感的事情发生吗abs
函数进入我的全局命名空间?
如果重要的话,我正在使用
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.6)
最有可能的iostream
包括stdlib.h
做它的一些工作。这是标头的 C 版本,其中声明abs
for int
仅在全局命名空间中(在 C 中你必须使用fabs
for double
值)。
我不知道有什么具体的方法可以保留abs
以这种方式包含在内,但我确实知道 g++ 4.5 是much更好地避免基本包含带来的多余内容,例如iostream
and string
.
也可能收到警告,指出双精度数被截断为 int (编辑:是的,使用-Wconversion
警告)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)