C语言的缺陷
命名空间
这里有一段代码,可以正常打印rand
但如果包一个头文件,程序就会报错,这是因为C语言库里包了一个rand函数,这是用来求随机值的,就与定义的变量rand重名了。
在C语言中,相同域里不能重名,不同域则是可以
这里的4个a并不相互冲突
若想在f1里访问到全局的a,就要加::,叫做域作用限定符
这里第一个a会先在::的左边找,左边找不到就在全局找
还有一种情景:
小A实现了队列
小B实现了链表,两个文件放入一个项目
试运行发现struct重定义
这时c++作者就想设计出了命名空间
将小A的代码封装在命名空间AA里
B的代码也封装在BB里
这样就可以解决冲突的问题,但是编译器首先会在局部找,接着在全局,但是默认不会在命名空间找
所以还需要写一个在指定命名空间中找的代码,这样就能解决了;
最后,当命名空间冲突的时候,可以在外面再嵌套一个;而且还能多层嵌套,但是就比较繁琐了
自从有了命名空间后每次使用时都要指定一下,较为繁琐
除了使用命名空间指定访问外,还有一种方法
叫做全局展开
其实c++标准库也被放在叫std的命名空间里,主要也是避免程序员定义的变量与C++库里的冲突 ,全局展开时就能使用C++库里的函数