The Design and Evolution of C++
17.1 引言
1.“对所有不适合放进某个函数、某个struct或者某个编译单元的名称,C语言提供了一个统一的全局性的名称空间,这就带来了名称的冲突问题…在我设计类型安全的连接机制时…我注意到,对以下形式:
extern "C" {
/*...*/}
的语法、语义和实现技术稍微做些修改,就能允许我们用以下形式:
extern XXX {
/*...*/}
表示在XXX中声明的名称位于一个分离的作用域XXX中,要从其他作用域中访问就需要用限定的XXX::形式,和在类之外访问静态类成员完全一样。
” (p.351)
17.4 一个解决方案:名称空间
1.“…访问名称空间成员采用访问类成员的传统记法:namespace_name::member_name。事实上,类作用域可以看成是名称空间作用域的一种特殊情况。”(p.355)
2.“考虑:
namespace A {
void f(int);
void f(char);
class String {
/*...*/};
}
在名称空间括号中声明的名称就是在名称空间A内部的内容,它们不会与全局的名称或者其他任何名称空间中的名称冲突。名称空间声明(包括定义)与全局声明具有完全相同的语义,只是它们名称的作用域被限制在名称空间内部。
程序员可以通过显示限定的形式直接使用这些名称:
A::String s1="Annemarie";
void g1()
{
A::f(1);
}
换一种方式,我们也可以显示地让某个特定库中的个别名称不需要限定描述而直接使用,这通过使用声明完成。
using A::String;
String s2="Nicholas"; //meaning A::String
void g2()
{
using A::f; //introduce local synonym for A's f
f(2); //meaning A::f
}
上述使用声明在一个局部作用域为它所提出的名称引进了一个同义词。
再换一种方式,我们也可以显式地要求一个特定库中所有的名称都直接被使用,不需要借助限定,这通过使用指示完成。
using namespace A; //make all names from A accessible
String s3="Marian"; //meaning A::String
void g3()
{
f(3); //meaning A::f
}
上述使用指示并不为局部作用域引进任何新名称,而只是简单地使有关名称空间中的所有名称都变成可以访问的。”(p.356)
17.4.3 名称空间的别名
1.“可以通过为长的名称空间提供短的别名的方式来解决:
//use namespace alias to shorten names;
namespace ATT = American_Telephone_and_Telegraph;
ATT::String s3=<