[英]Why is abs not in std?
#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++ 替代品?
为什么 abs 不在标准中?
你的问题有点错误。 abs
在std
中。 让我假设您在问“为什么 abs也在全局命名空间中?” .
除了在std
命名空间中声明之外,C++ 标准还允许在全局命名空间中声明 C 标准函数。
为什么会这样?
因为这些函数来自 C 标准库,并且因为标准允许它发生,并且因为您的标准库的实现方式。
如何在不弄乱我的命名空间的情况下使用这些功能?
这些名称保留给全局命名空间中的语言实现。 没有办法避免它。
不要将全局命名空间视为“您的命名空间”。 全局命名空间很混乱,而且永远都是。 你需要解决这个问题。
如果不可能,是否有 c++ 替代品?
C++ 替代方法是在您的命名空间中声明您的abs
:
namespace my_very_own_namespace {
int abs;
}
您应该在自己的命名空间中声明所有1 ,除了:
main
extern "C"
最困难的部分是为您自己的命名空间找出一个唯一的名称,因为它不能是 C 标准库已经使用的名称,也不能是全局命名空间中其他库使用的任何名称。
1在编写小型练习程序等时几乎没有必要遵循此经验法则。但在编写大型程序和依赖第三方库时就变得必不可少,更不用说在编写这些库供他人使用时了。
标准报价:
[extern.names]
使用外部链接声明的 C 标准库中的每个名称都保留给实现,以在命名空间 std 和全局命名空间中用作具有外部“C”链接的名称。
Each function signature from the C standard library declared with external linkage is reserved to the implementation for use as a function signature with both extern "C" and extern "C++" linkage,171 or as a name of namespace scope in the global namespace.
[标题]
除了 [library] 到 [thread] 和 [depr] 中的说明外,每个 header cname 的内容与 Z0D61F8370CAD1D412F70B82D 中指定的相应 header name.h 的内容相同。 然而,在 C++ 标准库中,声明(在 C 中定义为宏的名称除外)位于命名空间 std 的命名空间 scope 中。 未指定这些名称(包括 [support] 通过 [thread] 和 [depr] 添加的任何重载)是否首先在全局命名空间 scope 中声明,然后通过显式使用声明([namespace.udecl] )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.