我们总用限定修饰的名字形式namespace_name::member_name来引用名字空间成员, 但这种作法往往比较麻烦, 尤其是当名字空间成员很长的时候。为了使名字空间成员使用更方面, 我们用以下三种方式来克服名字空间使用上的不便之处。
1. 名字空间别名:
即用一个较短的同义词与一个名字空间名关联起来, 如:
namespace WindowsToolKit::DLCLib::LCMemory { // ... }
namespace DLCMem = WindowsToolKit::DLCLib::LCMemory;
利用名字空间别名也可以引用嵌套的名字空间, 如:
// 短别名
namespace mlib = cplusplus_primer::MatrixLib;
// 较易读
void func( mlib::matrix &m )
{
// ...
mlib::inverse( m );
}
一个名字空间可以有许多同义词或别名且所有别名和原来的名字空间名都可以交替使用, 如:
// Lib指向名字空间 cplusplus_primer::MatrixLib
namespace alias = Lib;
void func( Lib::matrix &m )
{
// ...
alias::inverse( m );
}
2. using 声明
using 声明以关键字using 开头后面是名字空间成员名using 声明中的成员名必须是限定修饰名, 例如:
namespace cplusplus_primer {
namespace MatrixLib {
class matrix { /* ... */ };
// ...
}
}
// 名字空间成员 matrix 的 using 声明
using cplusplus_primer::MatrixLib::matrix;
在遇到using 声明之后在全局域中或其嵌套的域中使用matrix 都将引用该名字空间成员。
与其他声明一样using 声明引入的名字有以下特性:
1) 它在该域中必须惟一
2) 由外围域中的声明引入的相同名字被其隐藏
3) 它被嵌套域中的相同名字的声明隐藏
3. using 指示符
我们可以使用using 声明使库中的名字变成可见的, 如果库非常大且应用程序使用了库中许多的名字,
则翻需要使用大量的using 声明, 而且往往容易漏掉且容易出错, using 指示符可以用来解决这个问题。
using 指示符允许我们让来自特定名字空间的所有名字的简短形式都可, 如:
// using 指示符: cplusplus_primer 的所有成员都变成可见的
using namespace cplusplus_primer;