2012-02-28 84 views
7

在stlport的库中,我看到这样的代码:STLPORT:namespace std {}是什么意思?

namespace std { } 
namespace __std_alias = std; 

1.他们试图抵消在第一线的标准std命名空间?
2.为什么在世界上他们会用一个更长的别名代替原来的名字?

+5

'namespace std {}'不会使'std'无效,它只是不加任何东西:)而且,当然,将名称带入作用域。 – 2012-02-28 13:17:19

+0

好的,只是把它放到文件的范围内,命名空间的内容保持不变。花括号{}}只是为了在那里。他们既不向命名空间追加任何东西,也不会带走任何东西。谢谢! – Nav 2012-02-28 13:21:32

回答

8

在为其声明别名之前,您需要“范围内”的命名空间。空的namespace std {}通知编译器名称空间存在。然后他们可以为它创建一个别名。

除了创建快捷方式之外,还有创建别名的原因。例如,您可以定义一个宏来“重命名”命名空间 - 考虑#define std STLPORT_std的影响。只要您使用头文件播放正确的排序游戏,使用别名可以访问原始名称空间。

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

  2. 我猜想,所以他们可以很容易地改变他们的库实现在::std以外的名称空间(通过将__std_alias更改为其他别名)。例如,如果你想测试两个并行的实现,这会很有用。

0

除了什么D.Shawley说,前声明一个类,这是一个命名空间内需要相同的语法:

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

你的例子唯一的问题是vector有第二个参数,分配器,所以这个前向声明可能会让你后来陷入麻烦。 – CashCow 2012-02-28 13:37:47

+0

我同意矢量不是最好的例子,我只是想要我们都知道和爱的东西:) – 2012-02-28 13:40:01

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,只需更改一个头文件,而不是所有的代码。