这段代码是正确的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”数据类型和函数不需要 namespace 限定。

在我看来,这是一种危险的行为,因为两者都被接受并且名称冲突的可能性仍然存在。我以为(错误?),那里是标准 namespace std来保护我免受此侵害。

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

我了解与遗留代码有关的问题,但是尽管有“.h”头文件(iostream.h,...)专门解决了这一点,但是我知道。

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

最佳答案

从C++ 11开始,正式允许实现将在<cxxx> header 中定义的C标准库名称放入全局 namespace 中。这并不意味着它们是必需的,因此您的第二个代码示例可能在其他平台上失败。

因此,对于C标识符不需要std并不是完全正确的。就是说,在某些实现中可能不需要它。

请注意,在C++ 11之前,无论如何从技术上讲,许多实现都可以做到。

关于c++ - 为什么旧的C标识符不需要 namespace std?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32719536/

10-09 19:56