繁体   English   中英

为什么 abs 不在标准中?

[英]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 不在标准中?

你的问题有点错误。 absstd中。 让我假设您在问“为什么 abs也在全局命名空间中?” .

除了在std命名空间中声明之外,C++ 标准还允许在全局命名空间中声明 C 标准函数。

为什么会这样?

因为这些函数来自 C 标准库,并且因为标准允许它发生,并且因为您的标准库的实现方式。

如何在不弄乱我的命名空间的情况下使用这些功能?

这些名称保留给全局命名空间中的语言实现。 没有办法避免它。

不要将全局命名空间视为“您的命名空间”。 全局命名空间很混乱,而且永远都是。 你需要解决这个问题。

如果不可能,是否有 c++ 替代品?

C++ 替代方法是在您的命名空间中声明您的abs

namespace my_very_own_namespace {
    int abs;
}

您应该在自己的命名空间中声明所有1 ,除了:

  • 该命名空间本身
  • main
  • 允许的其他命名空间中名称的模板特化
  • 跨语言 API 即任何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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM