【发布时间】:2021-08-06 21:05:18
【问题描述】:
#include <cmath>
int abs;
int main()
{
}
这段代码抛出编译错误
error: 'int abs' redeclared as different kind of symbol
note: previous declaration 'int abs(int)'
如果我从cstdlib 包含它,也会发生同样的事情。
我阅读了这份文档https://en.cppreference.com/w/cpp/numeric/math/abs
这里没有提到abs 将在std 之外定义。事实上,它到处都明确提到它为std::abs。
其他函数也会发生同样的情况,例如sqrt。
为什么会这样?如何在不弄乱我的命名空间的情况下使用这些功能?如果不可能,有 c++ 替代品吗?
【问题讨论】:
-
在 C++ 之前,有 C。
-
这个问题似乎与链接的副本不同。或者我没有看到重复中的哪个答案回答了这个问题。
-
c++ 实现必须有
std::abs没有什么能阻止他们在全局命名空间中声明abs -
标准要求这些可以在命名空间
std中访问,但不要求它们不被添加到全局命名空间中。 -
@FrançoisAndrieux -- 规则是
<cxxx>标头是必需 来声明命名空间std内的所有相应C 函数并且是允许的 也将它们放在全局命名空间中。同样的事情,相反,<xxx.h>标头:它们需要将名称放在全局命名空间中,并且允许也将名称放在 @ 987654335@命名空间。
标签: c++