ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【C++ 入门】命名空间 namespace 超详解:从 Hello World 到告别命名冲突

【C++ 入门】命名空间 namespace 超详解:从 Hello World 到告别命名冲突 【C 入门】命名空间 namespace 超详解从 Hello World 到告别命名冲突那基础必须先来一套Hello World!开开胃喽#includeiostreamusingnamespacestd;intmain(){coutHello World!endl;return0;}这怎么和C语言里的差别这么大这里的std,cout等我们都看不懂没关系接下来我将依次讲解。命名空间namesspce存在的意义在 C 和 C 代码里会写很多变量、函数后面还要学类。这些东西的名字如果全都扔在同一个全局范围里就很容易出现名字撞车。命名空间就是用来解决这个事儿的把各种名字做个分组隔离防止重名打架。C 专门搞出namespace这个关键字就是为了解决命名冲突、名字污染的问题。C 语言写项目的时候经常就会遇到函数、变量重名冲突。C 引入命名空间就是为了更好处理这种重名麻烦。#includestdio.h#includestdlib.hintrand10;intmain(){printf(%d\n,rand);return0;}namespace的定义想要创建命名空间就用namespace关键字后面写上命名空间的名字再跟上一对大括号{}大括号里面放的就是这个命名空间里的内容。变量、函数、自定义类型都可以写在命名空间里面。namespace 说白了就是开辟一块独立的名字区域它和全局区域互不干扰。不同的区域里可以用一模一样的变量名这样之前 rand 那种重名冲突问题就不会出现了。C 里一共有好几种域函数内部的局部域、全局域、命名空间域还有后面要学的类域。域的作用就是告诉编译器该去哪里找变量、函数、类型的定义。靠域把名字隔开就能避免重名打架。要注意局部域和全局域不光决定编译器怎么找名字还会控制变量能存活多久但命名空间域和类域只管名字查找不会改变变量的生命周期。namespace 要写在全局位置同时命名空间还支持嵌套一个命名空间里面可以再套另一个命名空间。如果是多文件的项目不同源文件里写名字相同的 namespace编译器会把它们当成是同一个命名空间不会报冲突错误。另外 C 的标准库所有内容全都放在名叫 std代表标准的命名空间里面。#includeiostream#includestdlib.h//1.正常的命名空间定义//2.lc是命名空间的名字一般开发中是用项目名字做命名空间名namespacelc{//命名空间中可以定义变量/函数/类型intrand10;intAdd(intx,inty){returnxy;}structNode{intx;structNode*next;};}intmain(){//这里访问的是全局的rand函数指针printf(%p\n,rand);//这里指针lc命名空间的randprintf(%d\n,,lc::rand);return0;}命名空间的嵌套使用// 命名空间可以嵌套定义namespacelc{namespaceA{intrand10;intAdd(intx,inty){returnxy;}}namespaceB{intrand20;floatAdd(floatx,floaty){returnxy;}}}intmain(){printf(%d\n,lc::A::rand);printf(%d\n,lc::B::rand);printf(%d\n,lc::A::Add(5,7));printf(%.2f\n,lc::B::Add(3.4,5.7));}我们在项目组里也可以进行命名空间的嵌套多文件中定义同名命名空间会自动合并就像在同一个命名空间里一样。命名空间的使用编译器找变量、函数的定义的时候默认只会去局部范围或者全局范围找不会自动跑到命名空间里面去找。所以直接写代码就会编译报错。想要使用命名空间里面的变量或者函数一共有三种写法写清楚是哪个命名空间的再访问正式做项目优先用这个最稳妥。using 单独把命名空间里某一个成员拿出来用如果某个成员会频繁使用而且确定不会出现名字冲突可以用这种。把整个命名空间里面所有东西全部放开直接用实际开发不建议这么写很容易引发名字冲突只是自己写小 demo 练习的时候图省事可以用。命名空间部分展开usingstd::cout;intmain(){inta,b;cout可以直接用cout只展开了cout\n;std::cinab;// 输入coutab;}部分展开了之后cout就不需要在前面加东西了但是cin还是要的命名空间全部展开usingnamespacestd;intmain(){inta,b;cout可以直接用cou和cinendl;cinab;// 输入coutabendl;}这里就都不需要指定命名空间去访问了平常刷题和写小项目时使用起来确实是很方便的大的项目 还是推荐大家不要这样用。
返回列表