为什么遗留C标识符不需要命名空间std?

时间:2015-09-22 14:25:31

标签: c++

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

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

然而,编译也很好(GCC 5.2):

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

更一般地说,似乎遗产&#34; C&#34;数据类型和函数不需要命名空间限定。

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

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

我理解遗留代码的问题,但我认为&#34; .h&#34;头文件(iostream.h,...)专门用于解决这一问题。

修改linked question不重复,它会询问是否或不使用遗留功能的std::版本。我想知道的是这种行为背后的基本原理。

1 个答案:

答案 0 :(得分:3)

从C ++ 11开始,实现正式允许<cxxx>标头中定义的C标准库名称放在全局名称空间中。这并不代表他们必需,因此您的第二个代码示例可能会在其他平台上失败。

所以说C标识符不需要std并不完全正确。在某些实现中可能不需要它,也就是全部。

请注意,在C ++ 11之前,许多实现都是这样做的,尽管从技术上来说它们并不应该这样做。