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

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

编辑:说三道四文库 发布时间:2017-05-28 11:12
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 的回复:
总结起来就是:先往上找名字,找不到就出错,找到了但不匹配则在整个名字空间找,找到了且匹配则调用。


额,不会去整个名字空间去找的。
Facebook社交业务进军中国内地,困难重重 《近匠》透镜:代码级定位,让App性能监控更从容! 联想移动与云新战略 重点深耕企业移动方案 美国高通公司在深圳召开参考设计及无线创新峰会 提供“一站式”整合服务 友盟正式推出消息推送平台 iOS 8新功能再曝光:或推出分屏多任务功能 Framer:开源原型设计工具,巨头们的心头好 亚特兰大峰会精彩看点:软件吞噬世界,OpenStack是变革核心 数据中心基础设施是大数据战略成败的关键 实时大数据分析:网络分析的一种新方法 最新消息:iPhone 6将采用更大、更清晰的1704x960分辨率屏幕 吴毅挺:OpenStack是开源IaaS平台大势所趋的集大成者 做好扁平化设计-交互篇 狙击Google Glass?三星将推基于Tizen系统的Gear Glass GamePlay:跨平台开源3D游戏引擎,黑莓的努力你不懂 “少即是多” 高通QRD大会精华汇总 天云盾:构筑在云端的Web安全防护 解析大数据时代的数据库集群技术 莫里航海图,最早的大数据实践 弥补空缺!HappyFox面向iOS开发者发布开源移动HelpDesk SDK Chitika北美网络流量报告:WP KO黑莓、iOS超Android 《近匠》秦时明月:知名IP光环下的生存之道 微软研究院正式发布编程学习游戏Code Hunt 走近讲师:Memblaze刘爱贵讲述云计算中的闪存应用 【云先锋】ClouDil云方案:PB级大数据解决方案 一周消息树:这是要“发”啊?Google Brain之父正式加盟百度 最受欢迎的游戏引擎集结号:小白篇 多盟总设计师邢开捷:四两设计拨千金 Cocos2d-x游戏《Monster Strike》终结《智龙迷城》霸榜神话 高通物联网技术解决方案:从汽车到智慧城市 Arduino携手Atmel 发布Arduino Zero开发板 --->>300分,讨教IE编程!如何实现自己的IE收藏夹。在线等待 要在用户关闭页面时实现将用户的一些信息删除,该相应那个消息! 从微软出来的烂货 请教高手一个ejb架构的问题,急!! VC中的ADO事件编程 我想获得机器可用的最后一个盘符,我用GetLogicalDriveStrings返回a:\ 谁有指纹里脊检测的有效算法?给出论文名字我去找。。。 谁知道怎样在XSL里引用JavaScript的变量?? 有关文档存储的问题 怎样响应WM_NOTIFY消息?我的这个做法错在哪里? 不是ASP.NET的高手不要进来, 怎样将对话框放在所有窗口的最顶部? 关于二级联动下拉列表,请教高手!! 如何获取网页中的数据,请教各位大侠??? VB编程如何实现菜单及打印等功能 ehlib 2.0表格为什么导出到Excel中是空表的? VBA操作excel 请问什么函数可以实现 类似于用note打开一个文本文件 怎样把查询结果写到缓冲里 请教一个delphi 安装问题 请问,你们都用现成的数据库还是自己定义?(大家讨论讨论) 程序员的未来! 谁有《将标准C++视为一个新语言》一文? 求助 为什么装上Framework以后不能正确运行.ASPX文件? 要想学好vb.net,首先要学好什么???? 请各位帮忙:apache 支持asp 吗? 麻烦大家帮我看看这个历遍 尴尬中..... 2000系统中 这个进程占了CPU 99% 且不能结束!!!是什么进程??? 急!!!!!!!!!!!在线等待 抱错:在获得新的之前,必须释放所有ROW句柄 如何使用ASP进行文件上传代码的编写? 哪里能找到好一点版本的江湖下载啊? 小弟初学汇编,问大家一个基础的问题,请指教! 狂风系列问题:在ASP.NET中怎样写这样的SQL语句? Ehlib或其他Grid控件, 如何实现点击表头排序 ?要求不能重新重新执行SQL语句 请大家试试,google是不是不能用了??郁闷ing.... 怎么google打不开了? 这段代码出什么问题了?大家帮看一看。 如何察看源代码? 大家好啊!我有一个非常……的问题!是一个关于主机板的CPU温度测试问题! 怎么老是游人不停的ping我的80端口 Windows位图的数据结构 我为用户做了一个员工输入模块,但客户想把excel里面的表复制进我的员工输入摸块里面去 一个小问题。急 创建启动等待窗口,工程文件要添加哪些内容 只要有人可以把狗屎说成是精神 关于windows和Linux的问题 如何调用其他事件的过程?? 如何查询员工表中所有本月所生职工 英语翻译我也姓毛,一直觉得翻译为Mao不好听,请问可以翻译为Mo吗? 丹霞地貌是怎么形成的? 晚上,在桌面上铺一张白纸.把一小块平面镜放在纸上,让手电筒的光正对桌面照射,从侧面看去,白纸被照亮而平面镜却比较暗.从正面看上去,平面镜被照亮,而白纸却比较黑.请说明上述现象 家里水质不好(自来水) 怎么样可以解决切实问题急!我家里的水质不好(不用收钱好像),(我在吴江念书)爸妈在家(芦墟),自来水放出来的时候油红色的小虫,浑浊,有点咸味,长期喝这样的 母亲的爱 物理光学方面的两道题、、、、、1.1-光年是一个非常大的时间单位2-坐井观天,所见甚小 隐含了光的直线传播原理3-平静湖面上得到应,说明平面镜成‘与物等大正立的像’的规律不成立4-透过 AnyWay变频功率测试系统用于变频器直流母线电压、电流测量,应该选用什么测量模式? 为什么锅炉水中要去除离子 晚上,桌面上铺上一张白纸,把一小块平面镜放在纸上,让手电筒的光正对着平面镜照射,从侧面看去,白纸被照亮,而平面镜却比较暗.试用光学知识解释,这是为什么? 家里的自来水有时是黄色的,为什么怎样解决,我们是刚搬进来的,整栋楼是新的 经常会做梦梦到自己会飞,可是每次都飞不起来,请问代表什么意义吗?这样的梦会断断续续的做,有什么意义吗? 中学物理光学实验有哪些 变频功率测试系统宣传资料上写的测量参数精度是读数的0.2%, 为什么阴天大气逆幅射强? 1.在等腰直角棱镜CAB中 其中C是直角 现一束白光垂直AC边入射 入射点为O 若让白光束以O为轴 顺时针转动 则从AB边首先射出的光线是( )请分析一下原因 2.一束单色光斜射到厚平板玻璃的一个表 变频测试中,要准确测量功率,除了AnyWay之外,还有那些产品? 为什么晴天的白天要比阴天的白天温度高? 在暗室的桌面上铺一张白纸,把一小块平面镜放在纸上,让手电筒正对着平面镜照射,从侧面看上去()?A.平面镜比较亮,它发生了镜面反射.B.平面镜比较暗,它发生了镜面反射.C.白纸比较亮,它发 养热带鱼可以用饮用大桶水吗,家里的自来水最近水质不好发黄.养了4个鹦鹉3个地图两个泰国鲫. 丹霞地貌属于哪种地质作用形成的 冬天为什么那么冷呢? Wp4000变频测试系统主要测量什么量? 丹霞地貌形成的地质作用过程是什么?简要回答解析谢谢. 与根毛细胞吸收水和无机盐功能直接有关的细胞器是? 有一则寓言说,文学家、科学家、企业家和哲学家聚会时有人提议,各自用一句话来描述和称赞世界. 有谁知道丹霞地貌的形成背景,要具体点的哦! 与胚胎干细胞吸收无机盐离子有关的细胞器 举例说明吃“Mo”的“Mo”字怎么写? 物体对眼睛所成视角的大小不仅和___有关,还和___有关? 胚胎干细胞中与吸收无机盐离子有关的细胞器主要有什么? 为什么山地车车座又小又硬 举例说明吃“Mo”的“Mo”字应怎么写? 眼睛能看到 物体的尺寸大小就是不借助显微镜 水泵电机试验测量有什么困难,怎么解决? 吞mo四声,mo怎么写 如图所示,物体对眼睛所成的视角决定了物体在视网膜上所成像的大小,视角越大,所成的像越 已知a^2-2ab+b^2-1=0,试求(2a^3b-2ab^3)/ab(a+b) 修一条路,甲工程队单独做要12天,乙工程队单独要15天,丙要9天,哪队做得快 mò mo 怎么写?快! 水泵特性试验的目的是什么?应测量哪些项目?如何进行试验? 工程队修一条路,甲工程队12天可以修完,而乙工程队需要15天,两队合作几天可以完 视角的大小与物体到眼睛的距离有什么关系 水泵的主要技术参数有哪些?如何确定水泵的好坏? 主要从哪几个方面分析丹霞地貌的形成啊 视角的大小除了与物体到眼睛的距离有关,还和什么有关 为什么吹海风会变黑?如题 怎么学会控制自己的瞳孔尺寸?好像有一个民族的人就可以,我想知道为什么 什么鸟什么凤的四字词语 水泵有哪些重要的参数? 我的眼睛瞳孔能随自己的意识控制是怎么回事!患者信息:男 16岁 上海 就是变模糊和清楚!能按照自己的意识? 甲乙两个修路队从两端修一段公路,在距离中点15米处相遇,已知甲修了全长的40%,求全长.答对重金奖励.谢2,师徒二人公生产零件若干个,徒弟生菜的零件占零件总数的40%,若徒弟给师傅15个,则徒 水泵参数出水量每小时500m³,路程5000m,用什么样的水泵和多大管径的水管,能达到要求 细菌培养是什么意思?! 这个题的步骤是什么啊?简单说下让求的是那段就行. 吹海风会变黑么听说吹海风会变黑,是不是这样的呢? 要是晚上吹海风也会变黑么? 人工培养细菌的实际意义? 晚上,在桌面上铺一张白纸,把一小块平面镜放在纸上,让手电筒的光正对桌面照射,则从侧面看上去? 克雷洛夫是()a:法国寓言作家 b:用散文体写作的寓言家 c:俄国19世纪的寓言家 d:意大利的寓言家 细菌分离培养的意义 下列哪些是与全反射有关的A 露水或喷泉的水珠,在阳光照耀下格外明亮B 口渴的沙漠旅行者,往往会看到前方有一潭亮晶晶的池水,当他们喜出望外地奔向那谭池水时,池水总是遥不可及C D都对
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘