为什么 iostream 定义了一个 abs 函数,我该如何阻止它?

2024-01-04

以下 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(使用前将#替换为@)

为什么 iostream 定义了一个 abs 函数,我该如何阻止它? 的相关文章

随机推荐