一、为什么使用命名空间

考虑一种情况,当我们有两个同名的人,Zara,在同一个班里。当我们需要对它们进行区分我们必须使用一些额外的信息和它们的名字,比如这个区域,如果它们生活在不同的区域或者它们的母亲或父亲的名字,等等。

在您的 C++ 应用程序中也会出现同样的情况。例如,您可能正在编写一些具有名为 xyz()函数的代码,并且还有另一个可用的库,它也具有相同的 xyz()函数。现在编译器无法知道您在代码中引用的 xyz()函数的哪个版本。

名称空间(namespace)被设计来克服这个困难,并被用作额外的信息来区分类似的函数、类、变量等等,它们在不同的库中具有相同的名称。使用名称空间,您可以定义定义名称的上下文。本质上,名称空间定义了一个范围。

二、命名空间的定义

在 C 语言中只有一个全局作用域:

| 1.C 语言中所有的全局标识符共享一个作用域 |
| 2. 标识符之间可能发生冲突 |

C++ 中提出了命名空间的概念:

| 1. 命名空间将全局作用域分成不同的部分, |
| 2. 不同命名空间中的标识符可以同名而不会发生冲突 |
| 3. 命名空间可以发生嵌套 |
| 4. 全局作用域也叫默认命名空间 |

语法:

C++ 命名空间的使用:

| 使用整个命名空间:using namespace name; |
| 使用命名空间中的变量:using name::variable |
| 使用默认命名空间中的变量: ::variable |

Example:

  1. #include <stdio.h>
  2. #include <iostream>
  3. namespace First
  4. {
  5. int i = 0;
  6. }
  7. namespace Second
  8. {
  9. int i = 1;
  10. namespace Internal //嵌套命名空间
  11. {
  12. struct P //嵌套命名空间
  13. {
  14. int x;
  15. int y;
  16. };
  17. }
  18. }
  19. int main()
  20. {
  21. using namespace First; //使用整个命名空间
  22. using Second::Internal::P; //使用嵌套的命名空间
  23. printf("First::i = %d\n", i);
  24. printf("Second::i = %d\n", Second::i); //使用命名空间中的变量
  25. P p = { 2, 3 };
  26. printf("p.x = %d\n", p.x);
  27. printf("p.y = %d\n", p.y);
  28. system("pause");
  29. return 0;
  30. }

编译运行,输出结果:
C++命名空间(namespace)详解 - 图1

三、using指令

可以使用using namespace指令避免使用名称空间前置。该指令告诉编译器后续代码正在使用指定命名空间中的名称。
Example:

  1. #include <iostream>
  2. using namespace std;
  3. // first name space
  4. namespace first_space {
  5. void func() {
  6. cout << "Inside first_space" << endl;
  7. }
  8. }
  9. // second name space
  10. namespace second_space {
  11. void func() {
  12. cout << "Inside second_space" << endl;
  13. }
  14. }
  15. using namespace first_space;
  16. int main () {
  17. // This calls function from first name space.
  18. func();
  19. return 0;
  20. }

编译运行,输出结果:
C++命名空间(namespace)详解 - 图2

四、std命名空间

下列代码可以引用cout而不预先添加命名空间:

  1. #include <iostream>
  2. using std::cout;
  3. int main () {
  4. cout << "std::endl is used with std!" << std::endl;
  5. return 0;
  6. }

编译运行,输出结果:
C++命名空间(namespace)详解 - 图3
<本文完>

参考资料:

1)唐佐林《C++深度解析教程》
2) tutorialspoint