【发布时间】: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++