说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

昨天那个namespace的帖子之后,把自己的疑惑解决了一下,希望能学到更多.

编辑:说三道四文库 发布时间:2017-01-18 08:05
HTML文档下载 WORD文档下载 PDF文档下载
/C++

首先,必须说一下C++标准库里,是如何使用namespace的。

要明白几点:

1,全局作用域其实也是一个namespace,只是编译器隐藏了它的展开。
2,C++标准库(STL)里充斥着泛型与重载。
3,模板类的成员函数,模板函数的实现都是直接写在头文件里,而不是分离编译.
4,既然全局作用域也是一个namespace,不同的源文件的全局作用域就对应于不同文件的同一个namespace一样。
5,全局作用域如何声明,如何防止重定义,和自定义namespace是遵循一样规则的。所以,非模板函数,
非模板类的成员函数定义与声明要分开,头文件里写声明,源文件里写定义。 这和模板的做法是不同的,要注意。

暂时说这些,其他的比较麻烦,拿源码来看,往下继续.


/C++
// string standard header
#pragma once
#ifndef _STRING_
#define _STRING_
#ifndef RC_INVOKED
#include <istream>

 #pragma pack(push,_CRT_PACKING)
 #pragma warning(push,3)

 #pragma warning(disable: 4189)
 #pragma warning(disable: 4172)

_STD_BEGIN //namespace std{

模板函数的各种定义!!

_STD_END //}

 #pragma warning(pop)
 #pragma pack(pop)

#endif /* RC_INVOKED */
#endif /* _STRING */


看到_STD_BEGIN和_STD_END,我已经做了宏替换的注释. 

这是<string>头文件里的形式,可以看到,标准库里所有的头文件都是包含在namespace std里的,
而namespace是可以叠加的,举个很易懂的例子。

#include <iostream>
#include <string>

int main()
{
std::ve       
//我没有包含<vector>,可以根据上边string的头文件的样子知道,
//此时我只能见到string头文件里那段namespace std,所以当我尝试std::vector的时候,我并不能找到vector。
//除非你#include <vector> ,那么当前源文件里就累加了两段namespace std,所以此时std::vector就能看到了。
STD::Interface('a');

    return 0;
}

根据这个小例子可以差不多理解namespace与头文件的结合,并且是如何给用户使用的。




/C++
昨天的帖子里的问题已经难寻踪迹,先贴上我下去之后设计的测试代码,
之后讲一下为什么看起来不可以的做法却能成功,
借此进一步理解namespace的作用原理(一定要记住全局作用域也是一个namespace,
假设叫namespace globle)。



interface.h
/C++


#ifndef INTERFACE_H
#define INTERFACE_H

#include "func.h" //##

namespace STD //标准库命名空间,相当于std
{
template <class T>
void Interface(T n)
{
func(n); //调用依赖于函数声明,所以引入了func.h,见##位置
}
}

#endif 



func.h

/C++#ifndef FUNC_H
#define FUNC_H

#include <iostream>

namespace STD
{
template <class T>
void func(T)
{
std::cout<<"T"<<endl;
}
}

#endif


main.cpp

/C++#include <iostream>
#include <string>
using namespace std;

#include "interface.h"

namespace STD
{
template <>
void func<char>(char)
{
cout<<"char"<<endl;
}
}

int main()
{
STD::Interface('a');

    return 0;
}


STD即模仿我们的C++标准库std,interface.h是STL提供的一个模板函数,它调用了func.h里的一个函数,
所以interface.h里需要包含func.h头文件,以便满足声明依赖要求(要调用一个函数,
只需要见到函数的声明@@@@@注,这里是模板函数,所以声明与定义不做区分,直接包含头文件即可)。

在main里,我们包含了interface.h,所以我们能够访问STD::Interface('a');

但我们必须注意,Interface.h里的Interface函数之前累加了一个从func.h里引入的函数func,
所以在main里我们同样可以访问到STD::func。 

/C++
那个帖子里,几位高人基本上使用的都是在main文件里扩充std来实现了一个函数的重载,
从而改变了STL的运作过程而不必修改STL库。 

从普通角度看,我们在main里特化了func,并且也把它加入到STD里,但是Interface的名字查找是往上进行的,
按道理是不会找到我们的特化的。 (昨天的帖子里不是特化,是重载,更能说明问题。) 
但却能运行起来,并且成功调用特化的版本,这正是因为interface之前有一个func模板函数的原因,
所以interface在查找func函数的范围扩增到了整个名字空间。

下面就是一个重载的例子,前两个namespace是标准库原有的,而我最新添加一个重载,一样能够得以调用,这就充分说明了
重载与特化对名字查找范围的影响,这个在全局作用域这个namespace里也是一样的,也就是说,namespace只是划分了空间,避免名字冲突,其实它没有做太多事。

#include <iostream>
#include <string>
using namespace std;

namespace STD
{
void b(int)
{
}
}

namespace STD
{
template <class T>
void a(T n)
{
b(n); //以上两个STD内的内容,理应调用b(1)
}
}

namespace STD //在main里临时添加重载,虽然函数位于a()之后
{
void b(double)
{
cout<<"double"<<endl;
}
}

int main()
{
STD::a(1.4);

    return 0;
}






代码不好用啊,算了.

谁看过昨天的帖子,有疑问的话看一下例子就懂了.
昨天的贴子同样收获匪浅,却没有lz这么高的认识
没啥疑问,疑问是csdn的ubb代码排版怎么又挂了……
问题是,C++标准不允许扩充std,只可以特化std里的部件。
总结起来就是:先往上找名字,找不到就出错,找到了但不匹配则在整个名字空间找,找到了且匹配则调用。
呃,楼主还是劳金手翻翻<C++ Primer>吧,貌似这个总结和我记忆中的偏差比较大。
额,说错了么。。。没在宿舍,求规则。
谁能没事背得出那么长的,又几乎一点用也没有的规则。
凡需要搞清此规则才能明白的代码,一般都可以定性为垃圾代码,直接打回重写。除非你是在实现boost这类库程序。
针对昨天那个帖子做了实验,感觉规则基本就是这样。如果真是我们来作一个库,需要重载或特化,那直接进去改就行标准库里根本不需要利用规则来安排名字查找,作好前置声明就行。  

这不就是因为有个前提条件,所以作了点编译器规则探索么。
这种东西,靠代码来探索基本都是浪费时间。
直接翻书、翻标准,更快更准。
引用 5 楼 qq120848369 的回复:
总结起来就是:先往上找名字,找不到就出错,找到了但不匹配则在整个名字空间找,找到了且匹配则调用。


额,不会去整个名字空间去找的。
2012移动开发工具盘点:傻瓜式游戏工具引擎 《福布斯》发布年度“未来之星” 扎克伯格上榜 Cloudera透露Impala发行版新功能及开源计划 Nokia落寞身影下 三星成为全球最大手机厂商 乐视网CTO:智能电视,一个诱人的议题 SeatGeek:Web设计师如何转型iOS开发? IE10支持HTML5标准拖放 IBM IT实践达人赛24强出炉 决赛圈比拼创新实践力 [简讯] Perl迎来25岁生日 软件开发者最重要的四大技能 为什么说惠普、戴尔和IBM在互联网发展中站错队 升级iOS 6还得看Google Maps 2012移动开发工具盘点:16大跨平台游戏引擎 GitHub Web游戏开发竞赛 获奖榜单出炉 Dart里程碑2发布 大幅提升dart2js性能 To Facebook:HTML5不好用?是你不会用! AWS推快照备份服务抵御宕机风险 靠谱吗? 微软品鉴会秀Windows 8电脑 上百款新设备年末上市 甩开外包,雄踞榜首:揭开“宫爆老奶奶”成功的秘密 IBM收购大数据公司StoredIQ 推动大数据传输能力 令人意外:前Windows部门总裁将去哈佛教书 舒迅:产品经理必读的九步法 独家爆料:Facebook移动客户端开发揭秘 一个独立开发者的自白:我如何在一年赚得60万美元 Dropbox收购Snapjoy 意欲打造媒体中心 2012世界“末日”:有经过正确的分析吗?! 23.5亿美元!谷歌出售摩托罗拉机顶盒业务 两家巨头相继放弃移动广告,移动广告形势堪忧? 应用洗牌,还能免费多久?Google推出iPad版Quickoffice 2012末日APP推荐 求生自救必备! Windows8上网利器 不卡死的IE10浏览器 MUGEN 人物预览利器 菜鸟请教:1delphi有什么好处——与别的语言相比 关于组播问题,急急急! 求:IE5.50使用代理服务器/不使用代理服务器 之间进行切换的代码 送分20!!! 周五不好干什么,没女朋友,编程水平又菜,学校又不好,文凭又差自修室又不开放??? 各位同志,我有个问题搞不清楚.请不吝赐教. 如何在局域网中实现共享只读文件(没有共享密码)的写操作 杭州的朋友,请问........ 如何在explore显示的网页的文本框中设置正文??? 谁能告诉我学软件工程到底有多少用? 这里有20分,谁要? 大家来看,这就是别人对中国程序员的看法! 寻找图书~? 获取NT管理员权限创意 ?寻找图书~? 为什么运行时正常的程序,编译成可执行文件后运行过程中出错... 怎样填充按钮客户区? 寻找图书~?? 请问如果数据量很大,比如大型企业的即时采集数据,应该用什么数据库系统处理呢?oracle,sysbase,db2,sqlserver还是cobol?? 这么简单的问题,难道就没有人能帮我了吗?!太遗憾了! 敬一杯“情人醉”给MM_mimi(人淡如菊),别人不要进来呀! 谁有过同样的遭遇??? 长整数除法的算法?? 关于Java Plug-in和Applet的一个问题 请求推荐有关SDK的好书!!!!!!! 我受不了了 个人主页链接如何让鼠标变成手形?谢谢! 老话题:三层结构中blob字段的存取出问题了? run-time类是怎么回事? 当多个程序对同一个文件进行读写操作,如何防止同时写入造成混乱? 求银行家算法的c程序! 请问W2K下面鼠标阴影的效果是用哪个API实现的? 我提议有编程经验的朋友们,一起来研究一种真正符合我们实际开发工作的模板 我用上kylix了!!!!!!! 请教,关于NT域用户的问题!NT账号,怎么设定唯一性呀?比如有aa的用户,我用aa登陆后,别人不能用aa同时登陆了?应该在那儿设置呀? Mfm1992?是个什么东西呀! 如何在informix/esql c中使用大事物? 如何保存收下來的email呢???!!!!! 关于一个网站建设的问题,望高手指点。 求救;如何建立一个登陆页面? 谁能给出一个远程访问互联网ACCESS数据库的经典代码?有28分送上! 怎样将-个十六进制数转换为十进制? 如何将java程序编译成dll文件 cannot focus a disabled or invisible window 一表我想通过文本框来增加记录,为何不能发送到表中,不要告诉我是没有post的原因。 奇怪,borland的开发能力这么强,为什么几乎没有一个象office那样流行的应用软件呢?如果它的应用软件很多,就不会象现在这样穷了吧? Delphi 数据库不如Power Builder 吗? 请问怎么安装新的控件? B样条曲线:如何由经过点反算控制点? Berzer曲线:如何由经过点反算控制点? 人教版六年级下册数学同步解析与测评35页4题答案一种农药用药液和水按照1:1200配制而成.1.如果现在有1.5kg的药液,能配制这种农药多少kg?2.要配制这种农药480.4kg,需要药液与水各多少kg?要准 人教版数学六年级上册配套练习册71页答案. 苏教版小学数学六年级补充习题61页第二大题 小学六年级数学下册配套练习与检测第38页思维拓展第9题解法在长度为1米的线段上任取10个点,至少有两个点,他们之间的距离不大于1/9米.为什么? 五年级下册人教版数学练习册第四页第五大题的第二小题怎么写 苏教版小学数学补充习题(六年级上册)23页答案 小学六年级数学练习册第25页第6题怎么做? 五年级下册数学练习册点中典12页 五大题1小题 人教版六年级上册数学补充习题49 50页 小学六年级上人教版数学练习册24页第一题2X( )=8分之9X( )=( )x16分之13分之2+( )=( )—8分之7=( )x100 五年级下册数学练习册56页五大题 六年级小学数学上册补充习题答案46到51页所有答案请你都告诉我! 六年级上数学练习册4.3习题的答案帮帮忙啊~ ~ 五年级下册数学练习册答案55-58 数学六年级下补充习题46——48答案拜托啦 六年级数学练习册答案66页第五题的第二小题 苏教版数学补充习题66~68答案要算式 苏教版六年级下册数学配套练习册86---95页答案苏教版六年级下册配套练习册! 苏教版六年级下册数学练习册48-50页的答案 68答案要算式 小学六年级下册数学苏教版练习册的第102页10.1111(1):一个长方形的长减少6厘米,面积减少30平方厘米,剩下的部分正好是个正方形,求原来的长方形面积是多少? 要有意思,列式( 六年级上册数学练习册人教版51、52的答案 苏教版六年级上册数学补充习题65 2010至2011六年级下册数学期中试卷苏教版 52谢谢你的关注,其实已经不需要了 小学六年级上册数学补充习题六十八页上的答案快帮帮我吧,给你们跪下了~~~~(>_ 六年级上册数学配套练习册64页 数学练习册5年级下册人教版52 小学数学苏教版补充习题六年级上册71-72答案 六年级上册小学语文配套家庭练习册11课第五大题第一小题答案老人是聋子吗?你是从哪里看出来的?用“波浪线”标一标……以后,每天清晨,我都到小树林去练琴,面对我唯一的听众,一位耳聋 人教版小学英语六年级下册课堂作业本50、51、52、53页答案没有答案的就不要来,不要空说,我要答案,高悬赏 人教版五年级上册数学书第67页第7题怎样做?快、、、、、、、、、 小学数学配套家庭练习册 六年级上册第10页第三大题第五小题答案. 第25页 急 给我发来可不 五年级上册数学书第6单元67页最后一题做怎么写? 1.甲、乙两数的比是5:6,甲比乙少2,甲数是( ),乙数是( ).这么算出来的. 10 人教版五年级上册数学课本第67页第4题 小学数学配套家庭练习册(北师大版) 苏教版六年级上册数学练习册50到57页答案 苏教版六年级上册数学书第67页第九题小明、小华和小军分别用4元各买一种水果.小明所买的水果重五分之四千克,是小华所卖水果的五分之二,是小军所卖水果的五分之三.他们各买了什么水果 青岛版六年级数学上册配套练习册50页计算题答案! 六年级上册数学练习册【66页】折扣——能力扩展体育服装专卖店根据市场需要,决定调整某款运动套装的售价.调整的方案如下:运动衣打八折,运动裤提价20%.这样每件运动衣和每条运动裤 人教版八年级上册数学书第66页的14题 谁有青岛版六年级下册数学配套练习册49页综合练习答案? 1、一根长方体木料的横截面是边长为5厘米的正方形。已知该木料长120厘米,这跟木料的体积是多少立方厘米?2、一个长5米宽4、5米高2米的无盖木箱,容积是多少(木板厚度忽律不计)3、 五年级上册数学书最后一页应用题(算式也要) 青岛版小学五年级下册数学配套练习册42页答案 急! 果园里桃树和杏树共180棵,桃树的棵树是杏树的3倍,桃树和杏树各有多少课?甲、乙、丙三个数的和是490,甲是丙的4倍,乙是丙的2倍.甲、乙、丙各是多少?三个连续自然数的和是246,求这3个数甲、 66页应用题答案 谁能告诉我小学人教版数学六年级配套练习册第36页的答案? 数学练习册五年级上册76页答案 小学五年级数学上册课本应用题的答案 六年级下册数学配套练习册第六单元综合练习答案人教版会的帮帮忙,不会的别说一些废话啊!整个大题(四)算一算不用给,其他的. 人教版 同步解析与测评下册 (检查孩子作业) 五年级上册数学练习册60页 小学6年级上册数学课本66页答案 小学六年级下册人教版数学检测第60页准确一点的答案! 一个工地用汽车运土,每辆车运X吨.一天上午运了6车,下午运了5车.这一天共运土( )吨,上午比下午多运( )吨.商场上午卖出电视机10台,下午卖出去7台,每台电视机a元.全天买电视机一共收入 在一个长25厘米,宽12厘米,高20厘米的长方体玻璃缸中放入一个棱长9厘米的正方体铁块,然后在玻璃缸中加入一些水,使铁块完全浸没在水中,当铁块从水中取出时,玻璃缸中的水会下降多少厘米?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn