在stlport库中,我看到了这段代码:
namespace std { }
namespace __std_alias = std;
1. 他们是在第一行试图取消标准std
命名空间吗?
2. 为什么他们要使用一个比原始名称更长的别名呢?
namespace std { }
namespace __std_alias = std;
1. 他们是在第一行试图取消标准std
命名空间吗?
2. 为什么他们要使用一个比原始名称更长的别名呢?
namespace std {}
告诉编译器该命名空间存在。 然后可以创建一个别名。#define std STLPORT_std
的影响。 有别名允许您访问原始命名空间,前提是您使用正确的头文件排序技巧。不,这只是确保命名空间的名称在当前作用域中可用。您可以在任何时候打开和关闭命名空间,而不影响命名空间的内容。
我猜,这样他们就可以轻松地将其库实现更改为一个其他命名空间(通过将 __std_alias
更改为别的别名)。例如,如果您想要将两个实现与彼此并排进行测试,则这将非常有用。
当编译器报告没有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,只需更改一个头文件,而不是所有代码。namespace std
{
template <typename T>
class vector;
}
namespace std { }
不会使std
失效,它只是什么也没有添加 :) 当然,它也将名称引入到作用域中。 - Magnus Hoff{}
只是为了存在而存在,它们既不会向命名空间添加任何内容,也不会删去任何内容。谢谢! - Nav