【C++指南】了解C++命名空间

发布时间:2026/8/3 20:29:26
【C++指南】了解C++命名空间 各位看官好我是egoist2023 种一棵树最好是十年前其次是现在今天来学习C命名空间的语法知识 如果觉得这篇文章有帮助欢迎您一键三连分享给更多人哦目录背景知识命名空间(namespace)为何引入namespacenamespace的定义namespace的使用背景知识C的起源要追溯到1979年当时Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)在贝尔实验室从事计算机科学和软件工程的研究项目。面对项目中复杂的软件开发任务他感受到了现有语言如C语言在表达能力、可维护性和可扩展方面的不足。于是C之父(本贾尼)在C语言的基础上添加了面向对象编程的特性设计出了C语言的雏形 此时的C已经有了类、封装、继承等核心概念为后来的面向对象编程奠定了基础。(C语言是面向过程)在随后的几年中C的应用逐渐增多。同时C的标准库和模板等特性也得到了进一步的完善和发展。随着C的爆火后便成立了ANSI和ISO国际标准化组织的联合标准化委员会并在1998年其标准被投入使用。C版本更新鄙人以为每一个学C的人都应当知道本贾尼(若你学了C有一天同事问你C创始人是谁你却闷声摇头怕是引人发笑)。命名空间(namespace)为何引入namespaceC语言存在一个命名冲突的问题而本贾尼针对这一问题写在了C中。在C/C中变量、函数和类(后续会讲解)都是大量存在的这些变量、函数和类的名称将都存在于全局作用域中可能会导致很多冲突。因此需要一个新的语法以避免命名冲突而namespace关键字的出现就是针对这种问题的。如果有一天你和你的同事分别写了一个Add函数此时想调用函数时会有语法报错这是因为存在了名字冲突。当你自己写了个命名空间这时就不会起冲突你和同事各自写了命名空间将Add函数各自封装在里面。若想调用其中一个Add函数用起的名字::的方式即可调用对应的函数。namespace的定义定义命名空间需要使用到namespace关键字其后跟命名空间的名字然后接一对{}即可{}中为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace myself{// 命名空间中可以定义变量/函数/类型int rand 10;int Add(int left, int right){return left right;}struct Node{struct Node* next;int val;};}namespace本质定义一个域这个域跟全局域各自独立不同的域可以定义同名变量因此上面Add函数就不在冲突了。C中域函数局部域全局域命名空间域类域域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑所有有了域隔离名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑还会影响变量的⽣命周期命名空间域和类域不影响变量⽣命周期。namespace只能定义在全局也可嵌套定义。namespace myself{//嵌套使用namespace self{int Add(int left, int right){return left right;}}}项目工程中多文件中定义的同名namespace会认为是⼀个namespace不会冲突。C标准库都放在⼀个叫std(standard)的命名空间中。namespace的使用编译器在查找一个变量的声明/定义时默认只会在局部或者全局查找并不会在命名空间中查找(namespace和全局域互相独立)。如何访问命名空间中定义的变量/函数呢有三种方式• C中提供了 ::指定命名空间访问项目中推荐这种方式。•using将命名空间中某个成员展开项目中经常访问的不存在冲突的成员推荐这种方式。•展开命名空间中全部成员这种方式在项目中不推荐冲突风险很大。但在平日的练习、刷算法题中可以使用(如展开std命名空间)。