这段代码是正确的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::
版本。我想知道的是这种行为背后的基本原理。
答案 0 :(得分:3)
从C ++ 11开始,实现正式允许将<cxxx>
标头中定义的C标准库名称放在全局名称空间中。这并不代表他们必需,因此您的第二个代码示例可能会在其他平台上失败。
所以说C标识符不需要std
并不完全正确。在某些实现中可能不需要它,也就是全部。
请注意,在C ++ 11之前,许多实现都是这样做的,尽管从技术上来说它们并不应该这样做。