STLPORT:namespace std{}是什么意思?

7
在stlport库中,我看到了这段代码:
namespace std { }
namespace __std_alias = std;

1. 他们是在第一行试图取消标准std命名空间吗?
2. 为什么他们要使用一个比原始名称更长的别名呢?


5
namespace std { }不会使 std 失效,它只是什么也没有添加 :) 当然,它也将名称引入到作用域中。 - Magnus Hoff
好的,这只是将其引入文件作用域,命名空间的内容保持不变。大括号 {} 只是为了存在而存在,它们既不会向命名空间添加任何内容,也不会删去任何内容。谢谢! - Nav
4个回答

8
在声明别名之前,您需要将命名空间“in scope”。 空的namespace std {}告诉编译器该命名空间存在。 然后可以创建一个别名。
除了创建快捷方式外,还有创建别名的原因。 例如,您可以定义一个宏来“重命名”命名空间--考虑#define std STLPORT_std的影响。 有别名允许您访问原始命名空间,前提是您使用正确的头文件排序技巧。

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

  2. 我猜,这样他们就可以轻松地将其库实现更改为一个其他命名空间(通过将 __std_alias 更改为别的别名)。例如,如果您想要将两个实现与彼此并排进行测试,则这将非常有用。


2

当编译器报告没有std这个命名空间时,这确实很烦人...编译器在想什么?当然它是存在的!

确实存在,但就像库功能一样,必须先声明。这就是第一行所做的事情。

通过重命名__std_alias,它允许给命名空间一个新的别名。你也许会在自己的代码中决定这样做。

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

这并不意味着你必须将所有内容都与该命名空间绑定,因为你可以有多个别名,并且可以有多个指向同一个真实命名空间。

假设我们想要调用我们的智能指针库sml。我们可以这样做:

namespace sml = boost; // or std

在代码的某个位置使用 #include <boost/shared_ptr.hpp>,从那个点开始在代码中使用它(同一个头文件)。
在我们代码的其他地方,我们使用 sml::shared_ptr。如果我们从boost切换到std,只需更改一个头文件,而不是所有代码。

0
除了D.Shawley所说的之外,前向声明一个位于命名空间内的类需要相同的语法:
namespace std
{
    template <typename T>
    class vector;
}

你的例子只有一个问题,就是vector有第二个参数,即分配器,因此这个前向声明可能会在以后给你带来麻烦。 - CashCow
我同意向量不是最好的例子,我只是想要一个我们都知道和喜爱的东西 :) - Nikola Smiljanić

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接