C++学习 -2 namespace大全
发布日期:2021-06-29 11:09:06
浏览次数:3
分类:技术文章
本文共 2223 字,大约阅读时间需要 7 分钟。
需具备的知识体系知识
1、编译链接 编译:C和C++都是按行编译,因此如果需要调用一个函数,如果在调用之前的代码里面没有定义或声明则会报编译错误,找不到 链接;主要是作用域和文件内外部链接属性相关的,这里就是要确保调用的时候能够找得到,编译和作用域的规则决定能否能够看到,链接是能够找到,而链接属性就会决定你是否能够找到。2、C语言中的常识
1)static;主要是限制其修饰的在同一文件使用(具体可修改局部(还会修改存储域有栈到数据段)和全局(修改链接属性,由外部变成内部)),实践一下,static定义的只会执行一次 2)extern;全局变量,和定义的时候都可以省略extern,其作用就是告诉链接器,extern修饰的是由外部引入的,需要去有其他外部链接属性的里面找。 3)小作用域优先于大作用域;类似于局部变量定义相同与全局变量的名字,则在局部内会优先使用局部定义的,优先级高于全局的3、引入C++中的namespace
1)命名空间的作用及用法 作用:对全局变量和函数等成员在一定范围内链接属性的更改和控制;意思就是打包的作用,将一些需要共同链接属性的打包到一起成一个命名空间,而想要调用里面的成员,那么就必须先调用到这个命名空间才能调用到里面的成员。从而通过命名空间名来控制链接属性,达到管理内部所有成员的链接属性。//直接根据之前的c基础和编译作用域规则推导即可#includeusing namespace std;namespace Ns1{ void f1() { cout << "1" << endl; }};//using Ns1::f1;//using namespace Ns1;int main(){ //f1();//如果没有前面的声明则会报错,因为作用域问题找不到 //因为定义在前则编译的时候能够找到(要先声明否则编译报错) //链接的时候指明Ns1则没有问题 Ns1::f1(); //f1();//在前面声明using namespace Ns1;或者声明using Ns1::f1(); return 0;}
2)同文件之间定义使用namespace
注意3点以及using的三种方法是不同概率3)不同C文件之间如何定义和使用namespace
其关键解决调用其他文件中namespace成员时的编译链接问题。从而就到了就是如果跨文件声明namespace成员的问题。//推导跨文件namespace要如何声明//namespace Ns1;//报错说没有{}//namespace Ns1{};//这个其实是再次定义了一个Ns1命名空间namespace Ns1{ void f1();};//C中学到,声明就是把定义去掉即可,这样可以调用到,应该是namespace本身就有外部链接属性namespace Ns1{ extern void f1();};//但是我们最好还是加上extern 表示这个函数从外部链接进来,int main(){ //f1();//同样先推导,直接这样些肯定找不到的,编译链接都不行 Ns1::f1();//这样可以尝试,同样报错找不到NS,那么因为在文件外,利用c中extern来声明 return 0;}/*test2.cpp#include注意的是跨文件声明的时候要挨个声明;未找到iostream的源码文件,不然截图展示, iostream的源码文件安装在/usr/include/c++下,gcc的头文件在/usr/include下using namespace std;namespace Ns1{ void f1() { cout << "1" << endl; }};*/
4)默认命名空间;也叫全局命名空间,正规可以用::直接调用,省略也是可以的,冲突时仍然是小优先于大的原则
#includeusing namespace std;namespace Ns1{ void f1() { cout << "2" << endl; } }using namespace Ns1;//这样的外部其实就是默认空间或全局命名空间void f1(){ cout << "1" << endl;}int main(){ f1();//可以直接省略调用,但是存在冲突时就会报错,因此调用命名空间中的最好加入命名空间的名字,前缀 //::f1();//也可以用正规的调用方法 return 0;}
4)匿名命名空间;主要用于跨文件时,不让其他文件使用匿名空间中的元素,因为没有名字你也调用不到,类似于C中的static,限制了链接属性,让其他文件无法调用到
就如之前夸文件声明命名空间一致 ,namespace Ns1{extern void f1();};,如果我们把命名空间的名字省略,那么也就是声明不了,找不到,那么
5)嵌套命名空间;冲突时其实就是遵守小优先于大,调用就是按顺序写过来就行了
引入朱有鹏老师C++课程;
注意体会这种学习方法,核心是: 第一步明确问题, 第二步自我分析, 第三步实验验证, 总纲是形成自我知识体系,本质上站在和语言特性设计者一样的高度来看待和学习研究语言。转载地址:https://blog.csdn.net/zw1996/article/details/105258219 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月29日 18时38分24秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JSONView - Chrome插件安装详解!(谷歌浏览器插件)!
2019-04-29
上传图片到阿里云OSS和获取上传图片的url的详解 !
2019-04-29
webstorm 和 phpstorm 有什么区别呢?做 WEB 开发用哪个好?
2019-04-29
常见位运算
2019-04-29
武大学生用python敲出樱花开放 | 附源码
2019-04-29
【中文教程】简单粗暴入门TensorFlow 2.0 | 北大学霸出品
2019-04-29
经典面试题:如何保证缓存与数据库的双写一致性?
2019-04-29
一份来自亚马逊工程师的Google面试指南,GitHub收获9.8万星,已翻译成中文
2019-04-29
硬货 | Redis 性能问题分析
2019-04-29
Kafka为什么这么快?
2019-04-29
灵魂四连问:API 接口应该如何设计?如何保证安全?如何签名?如何防重?
2019-04-29
一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!
2019-04-29
酸爽!IDEA 中这么玩 MyBatis,让编码速度飞起!
2019-04-29
已拿 Offer!字节跳动面试经验分享
2019-04-29
Windows路由表透析
2019-04-29
Java LockSupport 实战
2019-04-29
线程面试题实战与分析——各种锁的灵活运用
2019-04-29
Java 生产者和消费者面试题
2019-04-29
生产者消费者问题
2019-04-29
哲学家就餐问题
2019-04-29