这段代码是正确的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/