☰
【C++】命名空间详解
2026/10/3 2:26:40 网站建设 项目流程

目录

1.命名空间的目的

2.基础语法与访问

3.同名命名空间

4.命名空间使用


1.命名空间的目的

命名空间最根本的作用是防止全局命名空间污染。

#include<stdio.h> #include<stdlib.h> int main() { int rand = 1; printf("%d ", rand); // 1 }
#include<stdio.h> #include<stdlib.h> int rand = 10;//重定义 int main() { printf("%d ", rand); }
  • 编译器遇到rand,会先在局部进行查找,然后再去全局域
  • 下面那段代码冲突的原因是rand都在全局域

2.基础语法与访问

命名空间的定义

namespace MyLib { int age = 18; int add(int x, int y) { return x + y; } struct s { int age; char name; }; //... }//这里没有 ; //-------嵌套定义-------- namespace my { namespace mine { int age = 2; } } //------命名空间不能在局部使用-------- void test() { namespace my // err { int a = 0; } }
  • 命名空间可以定义变量,函数,类型等
  • 命名空间可以嵌套定义,嵌套深度没有限制
  • 命名空间只能定义在全局,不能定义在局部
  • 命名空间域不影响生命周期

域作用限定符 ::

Mylib::x; //访问指定域 ::x; //访问全局域

3.同名命名空间

  • 同一个文件下的 重名命名空间 是同一个


  • 不同文件下的 重名命名空间 也是同一个

虽然在不同文件下,但这两个空间是同一个,在链接时合并到一块,

所以用的时候要声明:

//file_2.cpp namespace you { extern int a; int b = 1; } int main() { printf("%d %d\n", you::a, you::b); // 0 1 return 0; }

4.命名空间使用

要使用命名空间中定义的变量/函数等,有3种方式:

  • 指定命名空间访问:例如,printf( "%d ", my: :a );
  • using声明:using 命名空间::成员名;将命名空间中的某个特定成员引入当前作用域,之后可以直接使用该成员的名字,无需再加前缀。 例如:
namespace my { int a = 10; } int main() { using my::a; // using 声明:只把 a 拿出来 printf("%d\n", a); // 正确,直接使用 a,不需要 my::a return 0; }
  • using指令:using namespace 命名空间名;将整个命名空间中的所有成员引入当前作用域
namespace my { int a = 10; int b = 20; } int main() { using namespace my; // using 指令:把 a 和 b 全拿出来了 printf("%d %d\n", a, b); // 正确,a 和 b 都能直接使用 return 0; }

注意:使用 using 时谨慎使用第二种方法,否则也容易造成名字冲突

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询