C++命名空间

  • 引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围
  • 命名空间有时也被称为名字空间、名称空间。
  • stdstandard 的缩写,意思是“标准命名空间”。代码中的 string、cin、cout 都位于命名空间 std。

定义命名空间

  • 命名空间的定义使用关键字 namespace,后跟命名空间的名称,如下所示:
namespace namespace_name {
   // 代码声明
}
  • 为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称,如下所示:
name::code;  // code 可以是变量或函数

using 指令

  • 您可以使用using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称。这个指令会告诉编译器,后续的代码将使用指定的命名空间中的名称。
namespace Li{  //小李的变量定义
    FILE fp = NULL;
}
namespace Han{  //小韩的变量定义
    FILE fp = NULL
}
  • 使用变量、函数时要指明它们所在的命名空间。以上面的 fp 变量为例。
Li::fp = fopen("one.txt", "r");  //使用小李定义的变量 fp
Han::fp = fopen("two.txt", "rb+");  //使用小韩定义的变量 fp
  • ::是一个新符号,称为域解析操作符,在C++中用来指明要使用的命名空间。
  • 除了直接使用域解析操作符,还可以采用 using 关键字声明。
using Li::fp;
fp = fopen("one.txt", "r");  //使用小李定义的变量 fp
Han :: fp = fopen("two.txt", "rb+");  //使用小韩定义的变量 fp
  • using 声明不仅可以针对命名空间中的一个变量,也可以用于声明整个命名空间。
using namespace Li;
fp = fopen("one.txt", "r");  //使用小李定义的变量 fp
Han::fp = fopen("two.txt", "rb+");  //使用小韩定义的变量 fp

不连续的命名空间

  • 命名空间可以定义在几个不同的部分中,因此命名空间是由几个单独定义的部分组成的。 一个命名空间的各个组成部分可以分散在多个文件中。
  • 所以,如果命名空间中的某个组成部分需要请求定义在另一个文件中的名称,则仍然需要声明该名称。下面的命名空间定义可以是定义一个新的命名空间,也可以是为已有的命名空间增加新的元素:
namespace namespace_name {
   // 代码声明
}

嵌套的命名空间

  • 命名空间可以嵌套,您可以在一个命名空间中定义另一个命名空间,如下所示:
namespace namespace_name1 {
   // 代码声明
   namespace namespace_name2 {
      // 代码声明
   }
}
  • 可以通过使用::运算符来访问嵌套的命名空间中的成员:
// 访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;
 
// 访问 namespace:name1 中的成员
using namespace namespace_name1;