【问题标题】:Why is namespace std not required for legacy C identifiers?为什么传统 C 标识符不需要命名空间 std?
【发布时间】:2015-12-19 14:07:21
【问题描述】:

这段代码是正确的 C++:

#include <ctime>
int main()
{
   std::time_t t = std::time(nullptr);
}

不过,这也编译得很好(GCC 5.2):

#include <ctime>
int main()
{
   time_t t = time(nullptr);
}

更一般地说,旧的“C”数据类型和函数似乎不需要命名空间限定。

在我看来,这是一种危险的行为,因为两者都被接受并且名称冲突的可能性仍然存在。我认为(错误地?)标准命名空间std 是为了保护我免受这种情况的影响。

所以我的问题是:为什么标准化委员会允许在 C++11 中出现这种行为?我的分析错了吗?

我了解有关遗留代码的问题,但我认为“.h”头文件(iostream.h,...)专门用于解决这一点。

编辑linked question 不是重复的,它询问是否应该使用std:: 版本的旧功能。我想知道的是这种行为背后的基本原理。

【问题讨论】:

  • iostream.h 实际上不是标准的 C++ 头文件。
  • @Galik 你能详细说明一下吗? ;-)
  • 事实证明,在某些系统上,C++ 实现只是必须使用现有的 C 函数。也许是因为其中一些所需的系统调用。因此,C++11 标准只是将命名空间 std 和全局命名空间之间的这种“泄漏”记录为现有实践。它也发生在 C++98 中,尽管该标准不允许这样做。
  • @Bo-Persson 不错的评论,考虑添加为答案。

标签: c++


【解决方案1】:

自 C++11 起,实现正式允许将定义在 &lt;cxxx&gt; 标头中的 C 标准库名称放在全局命名空间中。这并不意味着它们是必需的,因此您的第二个代码示例可能会在不同的平台上失败。

所以说 C 标识符不需要 std 并不完全正确。在某些实现中可能不需要它,仅此而已。

请注意,在 C++11 之前,许多实现还是这样做了,尽管从技术上讲它们不应该这样做。

【讨论】:

  • 并没有真正回答这个问题,只是重复了所问的问题。问题是“为什么”是允许的,理由是什么。
  • @SergeyA 是的,好点子。我可以删除这个。我专注于问题标题,这表明 OP 没有正确理解这种情况。
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 2022-07-06
  • 2015-02-10
  • 1970-01-01
  • 2018-12-04
  • 2012-11-12
  • 1970-01-01
相关资源
最近更新 更多