何为命名空间
-
命名空间的引入
(1)命名空间namespace,是C++引入的一种解决全局变量和函数名冲突的机制
(2)C语言没有namespace,但是C++及之后的java python等都有
(3)namespace的关键点有2个:一是如何解决名称冲突,二是如何合法访问变量 -
C语言如何解决名称冲突
(1)大项目中会有很多C文件,全局变量和函数都是extern链接属性,因此名称冲突是客观存在
(2)一个项目是一个单体程序,项目中的全局变量和函数理应能互相访问,因此名称冲突是客观存在
(3)C中解决名称冲突的办法是:第一,同一个C文件不要太大,由一个人写;第二,每个C文件(或几个C文件构成的一个模块)中所有全局变量和函数前加统一的唯一前缀;第三,不需要文件外访问的全局变量和函数前面都加static
(4)C语言的解决方案可行,C++早期就是这样做的,但这种方法太low -
命名空间如何解决问题
(1)为实现命名空间机制,C++引入了namespace关键字,定义格式为namespace xx{};
(2)一个特定名称的namespace的一对大括号内部定义的变量、函数、类等均属于该命名空间内
(3)在命名空间内部互相引用时可以直接使用变量名、函数名等
(4)跨命名空间互相引用时必须同时指定被引用方的命名空间名和变量名函数名才可以找到
(5)命名空间看起来就好像一种前缀
(6)命名空间本质上其实是对全局变量和函数在一定范围内链接属性的更改和控制 -
关于语言特性的思考
(1)语言特性是语言通过关键字或符号所支持的一种功能特性,如namespace、template、运算符重载、面向对象等
(2)语言特性必定对应解决某种问题,必定在某方面对程序员有帮助
(3)语言特性越多或者设计越复杂,则语言本身就越难使用,但语言就越厉害
(4)语言特性体现为某种语法,本质上靠编译工具链提供支持
(5)C++11/14/17/20的版本变迁,无非是新增或修正某些细节语言特性
(6)就事论事讨论编程语言,其实难点都在掌握和熟练运用语言特性上
namespace的初级定义和使用
-
同一文件内定义和使用namespace
// namespace的三种引用方法 // 方式一 ace::Mutex; // 方式二 using ace::Mutex; // 方式三 using namespace ace;
-
不同C文件间定义和使用namespace
// 外部文件声明namespce namespace ace(void func3(void)); namespace ace(extern void func3(void));
学习方法核心:
第一步明确问题;
第二步自我分析;
第三步实验验证,总纲是形成自我知识体系,本质上站在和语言特性设计者一样的高度来看待和学习研究语言。
C++默认命名空间
- 又称全局命名空间
- 默认命名空间引用其他命名空间方法
- 默认命名空间引用自己的方法
- 其他命名空间引用默认命名空间中的方法::f();
C++匿名命名空间
- std和cout的引入
(1)std是C++标准库定义好的一个namespace
(2)cout是std这个namespace下的一个标准输出工具,类似于C中的printf
(3)用法示例
#include <iostream>
using namespace std;
namespace
{
void func3()
{
cout << "hello world" << endl;
}
};
- 匿名命名空间的定义和使用
#include <iostream>
using namespace std;
namespace
{
extern void func3(void);
};
int main(void)
{
func3();
return 0;
}
- 匿名命名空间的价值
(1)匿名命名空间中的符号纯文件内部使用,不需要被外部引用
(2)匿名命名空间效果类似于全局变量和函数加static,但是比C中的static使用范围广
(3)匿名命名空间的用法逻辑上符合整个命名空间的一贯原则
嵌套命名空间
#include <iostream>
using namespace NS1;
namespace NS1
{
namespace NS2
{
void func2(void)
{
cout << "func2 from namespace NS1" << endl;
}
};
};
int main(void)
{
NS1::NS2::func2();
return 0;
}
namespace总结
- 记住最终目标:解决全局名称冲突,同时提供合法互相访问的机制
- 直接用法(语法),记住如何定义、如何声明、三种使用方法
- 特殊情况有默认/全局命名空间和匿名命名空间,均为符合一贯原则的特例用法
- 再次体会"语言特性"的含义
- C++的语言特性多而复杂,因此学习和使用难度高,关键在于掌握方法,从本质上学