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

前端之家收集整理的这篇文章主要介绍了c – 为什么遗留C标识符不需要命名空间std?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这段代码是正确的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 ::版本.我想知道的是这种行为背后的基本原理.

解决方法

从C11开始,正式允许实现将C标准库名称定义在< cxxx>中.全局命名空间中的标头.这并不意味着它们是必需的,因此您的第二个代码示例可能在另一个平台上失败.

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

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

猜你在找的C&C++相关文章