为什么要使用命名空间?
一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突。
为了解决合作开发时的命名冲突问题,C++ 引入了命名空间(Namespace)的概念。
命名空间将全局作用域分成不同的部分不同命名空间中的标识符可以同名而不会发生冲突命名空间可以相互嵌套全局作用域也叫默认命名空间
对于不带.h的头文件,所有的符号都位于命名空间 std 中,使用时需要声明命名空间 std;对于带.h的头文件,没有使用任何命名空间,所有符号都位于全局作用域。这也是 C++ 标准所规定的。
将 std 直接声明在所有函数外部,这样虽然使用方便,但在中大型项目开发中是不被推荐的,这样做增加了命名冲突的风险,我推荐在函数内部声明 std。
命名空间的使用实例:
#include <iostream>// namespace是一个关键字,用来定义命名空间
namespace NameA
{int a;void swap (int* a, int* b){int temp = *a;*a = *b;*b = temp;}namespace NameAA{};struct A{};
};int a;int main2_3()
{// 对命名空间中单个元素使用using NameA::swap;int b = 20;int c = 30;swap (&b, &c);a = 40;return 0;
}void func()
{}// 2、使用 using 关键字
int main2_2()
{// 表明使用命名空间NameA中的内容// 但凡在这个声明之后使用的变量或者函数,只要没有指明具体的命名空间// 都使用Name A中的内容// using 有效范围时当前的大括号{ }using namespace NameA;NameA::a = 100;// ::前不加名字,代表使用默认的命名空间::a = 20;func();printf ("a = %d, %d\n", NameA::a, ::a);int b = 10;int c = 20;// swap 没有指明命名空间// 但是之前有了usingspace NameA; 而NameA中有swapswap (&b, &c);return 0;
}// 命名空间的使用,1、域解析符::
int main2_1()
{a = 10; // 全局的aNameA::a = 20; // 使用命名空间Name A中的变量int b = 1;int c = 2;NameA::swap (&b, &c);printf ("b = %d, c = %d\n", b, c);return 0;}