当我们的程序势必会使用各种各样的库,这些库里会有各种各样的全局名 (不仅变量,类啊,函数啊,都可以是全局的) 为避免 name conflict,我们使用了 namespaces

Namespace Definitions

namespace cplusplus_primer { 
	class Sales_data { / * . . . * / }; 
	Sales_data operator+(const Sales_data&, const Sales_data&); 
	class Query { / * . . . * / }; 
	class Query_base { / * . . . * / }; 
} // like blocks, namespaces do not end with a semicolon

namespace 中可以放 declarations 和 definitions (再放一个 namespace 也是可以的)

namespace 只能放在 global scope 或 another namespace

Each Namespace Is a Scope

Scope 有的它也有

Namespaces Can Be Discontiguous, So…

写出来的定义分两种情况,要么 new 一个,要么 add 进去。因此

  • namespace 中那些类定义、实体声明,可以放进 header file 中
  • namespace 中那些实体就放进源文件里

Defining Namenspace Members

namespace 里可以直接用别的 menmber,namespace 外要域解析

跟 class 一样,解析过之后,就自己进入这个域了

Template Specializations

。。。

The Global Namespace

就是所有的 scope 之外的 scope (包括任何一个 namespace),并且每个文件都暗戳戳的存在于每个文件中。所有没有指明的都会被加进这个 global namespace
❓意思是说,如果一个在命名空间中的全局变量,是不会直接跟别的文件分享的吗?

::memeber_name 不指明全局命名空间来指明全局命名空间

Inline Namespaces

Unnamed Namespace