第九章 内存模型和名称空间(续)
- 声明区域:可以在其中进行声明的区域。
- 潜在作用域:从声明位置到其声明区域的结尾。
- 定义名称空间:
namespace Jack{ }
- 名称空间可以是全局的,也可以在另一个名称空间中,但是不能在代码块内。
- 默认情况下,名称空间中定义的名称其链接性为外部链接性。(除非它引用了常量。)
- 访问给定名称空间中的名称:
- 作用域解析运算符“
::
”:std::cout
- using声明:
using std::cout;
- using编译指令:
using namespace std;
- 如果某个名称已经在函数内被声明了,则不能用using声明来导入同样的名称。
- 函数中的using编译指令将名称空间的名称视为在函数之外声明的,但其他函数无法使用这些名称。
- 名称空间可以嵌套:
namespace elements{namespace fire{int flame;}}
- 使用嵌套:
using namespace elements::fire;
- 名称空间中仍然可以使用using声明和using编译指令。
- 创建名称空间的别名:
namespace MEF=myth::elements::fire;
可以用于简化嵌套的名称空间。
- 省略名称空间的名称来创建未命名的名称空间:
namespace{}
链接性为内部。
- 未命名的名称空间可以用于代替链接性为内部的静态变量的替代品:
static int counts;//通常情况下定义
namespace{
int counts;//同等效果的定义
}
- 通常情况下,将名称空间及包含的函数原型放在头文件中,在另一个源代码中在相同的名称空间中提供函数的定义。
- 一些指导原则:
- 使用在已命名的名称空间中声明的变量,而不是外部全局变量。
- 使用在未命名的名称空间中声明的变量,而不是静态全局变量。
- 不要在头文件中使用using编译指令。如果非要使用,应该放在所有#include后。
- 导入名称时优先使用using声明和作用域解析运算符。
- 对于using声明,首选将作用域设置为局部,而不是全局。
- 老式头文件(如math.h)没有使用名称空间,而新式头文件(如cmath)将函数都放在了名称空间std中。