STLPORT:命名空间std{}是什么意思

STLPORT: What does namespace std{} mean?

本文关键字:是什么 意思 std 命名空间 STLPORT      更新时间:2023-10-16

在stlport库中,我看到了以下代码:

namespace std { }
namespace __std_alias = std;

1.他们是否试图取消第一行中的标准std命名空间
2.他们为什么要用一个更长的别名来代替原来的名字?

在为其声明别名之前,需要命名空间"in scope"。空的namespace std {}通知编译器命名空间存在。然后他们可以为它创建一个别名

除了创建快捷方式之外,创建别名也是有原因的。例如,您可以定义一个宏来"重命名"命名空间——考虑#define std STLPORT_std的影响。使用别名可以访问原始名称空间,前提是使用头文件进行正确的排序游戏。

  1. 不,这只是确保命名空间的名称在当前作用域中可用。您可以在任何时候打开和关闭名称空间,而不会影响名称空间的内容。

  2. 我想,这样他们就可以很容易地将其库实现更改为位于::std之外的命名空间中(通过将__std_alias更改为别名)。例如,如果您想同时测试两个实现,这将非常有用。

如果没有std这样的命名空间,那么编译器出现错误会很烦人…编译器在想什么?它当然存在!

是的,确实如此,但与库特性一样,它必须首先声明。这就是第一行正在做的事情。

通过重命名__std_alias,可以为命名空间提供一个新的别名。有一天,您可能会决定在自己的代码中执行此操作。

也许你想在代码中使用shared_ptr,但又不想将代码专用于命名空间boost或std。因此,你可以创建一个别名,并将其"指向"boost或std。boost库中的其他功能后来成为标准功能,也是如此。

这并不意味着你必须对所有事情都使用这个名称空间,因为你可以有多个别名,也可以让多个别名指向同一个真实的名称空间。

假设我们想将我们的智能指针库称为sml。我们可以进行

namespace sml = boost; // or std

在代码中的一个位置,并且从代码中的该点开始CCD_。

在代码的其他地方,我们都使用sml::shared_ptr。如果我们从boost切换到std,只需更改一个标题,而不是所有代码。

除了D.Shawley所说的,正向声明命名空间内的类需要相同的语法:

namespace std
{
    template <typename T>
    class vector;
}