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

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

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


额,不会去整个名字空间去找的。
MeeGo复活!Sailfish OS智能手机 SDK发布 10亿美金!传闻谷歌要收购WhatsApp 从打造国内最大的OpenStack公有云开始 展望HBase的未来 你的数据库安全吗?CryptDB数据库软件可查询加密的SQL数据库 收藏!斯坦福Andrew Ng教授“机器学习”26篇教程全译 美国云计算价格战爆发 王寒:12岁儿童,该怎样开始iOS开发? 陈昊芝:腾讯!让我说你什么好? Top Paid与Top Grossing定价策略的差异 Android版百度云推送正式发布 为何开发者应推动公司开源? 从AppGratis被下架说起,苹果或将再次付出代价 58同城的“烦恼”——8K月薪安全工程师引发的入侵 软件开发实践的24条军规 思科 IBM 微软等巨头联合开发开源SDN项目OpenDaylight 巾帼不让须眉:2012年度云计算领域Top 10女性 中移动全力推进NFC 5月起乘公交可刷手机 支持Android与iOS,Qt 5.1 Alpha全新亮相 Google Play:劣质Android应用已无藏身之地! 360推出信用网站认证开放平台 联合百家协会围剿钓鱼网站 经验分享:百度测试架构师眼中的百度QA(一) 在线旅行服务行业开放API带来的新机遇 专访:悬疑恐怖游戏Year Walk美术及音效设计师 解密:微软都柏林数据中心的神秘“免费冷却”装置 云计算如何影响数字化营销? 榜单:十位帮我们打理数据的存储大佬 OpenStack Grizzly版发布 Comcast、CERN成为新会员 谷歌携Blink来势汹汹 WebKit将成明日黄花? 星巴克与苹果合作 顾客可免费下载付费App 微信回应信令争议 将启动2.5G网络优化计划 如何自画窗体或者PANEL,让小图象在上面排列,然后再根据顺序,一次改变小图象呢? asp.net 上传图片问题? xml中怎么取得这个值呀? 请大家给介绍一本学VC++.NET的书!谢谢 有谁用过solpartwebcontrols.dll控件来建立菜单的,请进! pcanywhere联机方式 高手请进,关于MFC的消息映射。 问一个可能是低级的问题:嵌在网页中的Windows Control能不能打印 请教:我用一个COMBOBOX作为存放表字段名,如何SELECT搜索满足条件 “三个代表”具体是指什么,希望各位JJGGMM帮忙解释一下了,谢谢!(90度鞠躬!!!!~~) 如何将装入到graphi字段的图片压缩?? 看过windows程序设计的朋友请进来 asp调用存储过程问题请教!!!!急!!!! IIS不能使用了该怎么解决? 请教C#问题(1)?? Oracle Intermedia Text支不支持中文的模糊查询 我是ORACLE菜鸟,现有一SQL语句(SQL Server语法),想转换成ORACLE语法,请指点 数据库连接问题??????????? 大虾,请看这里看看? vb中字符串中怎么输入双引号(")或单引号(')? 大家帮忙看看为什么这段代码不工作? ████ 这个帖子骂人,请斑竹秉公处理!!!!!!!████ 怎么样让时间加一个差值; 在另一个类中,怎样给Radio或Combobox赋值 ~~~~向各位高人请教三层线程模型,分可以另开贴加。 new出来的idicmpclient的onreply事件怎么响应? 那位大虾帮我看一下这断代码(JSP高分请教) 帮帮忙啦,哪位同志用过mscomm控件做点对点拨号通讯的 AspRunner是个不错的辅助编写ASP页面的工具,请问哪里有破解下载的啊?谢谢了! 在vc#中如何删除目录下的所有文件? 急 关于分级菜单 求救,如何在注册表中得到一个硬件设备(如猫)的驱动文件名称? 一个难题,希望高手能解决,急切等待! 关于网络状况测试的问题 新手上路,问一个很初级的问题,呵呵。。。 请问如何实现在同一个窗口中的自动跳转? 为什么不能调用类? 关于SQL语句求助 如何在asp和asp.net里面共享信息 溢出错误,麻烦来看看! 知道汉字的国标(gb?)码值,如何显示汉子,急求救!!!! 在SQL2000怎样建立全文索 Cannot start SQL Server Agent 能用case when 举一个例子吗?如果工资>1000 职务='处长',如果工资<1000 职务='科员' 如何将从xml文件中读取的文本在网页上保持格式的显示? sql语句求助!1 有宁波考高程的吗?有参加班的吗? 水晶报表问题???高手请进!!!!!! 使用openquery建立视图。急!急!急!急!急!急! 如何做一个好的餐饮管理者 (会多一个人)是多少笔划 如题,谁告诉我巫山最高峰乌云顶的地理位置, 项目管理计算题1.某项目计划工期为30周,预算成本为100万元.在项目进行到16周时,项目经理列出了前15周(包含第15周)的项目状态数据如下:截至项目状态日期,项目实际已完成的工作量为45% zippo07啥意思 求解《项目管理》计算题某房地产项目总工作量30000平方米,预算造价(计划价格)为800元/平方米,工期计划300天完成(注:每天完成100平方米,实现投资额8万元).开工后30田,业主的项目管理 项目管理计算题实在是不会了 某项目预算总成本为400万元,计划工期为2年.在实施过程当中.通过成本记录的信息可知:开工后一年末的实际发生成本为100万元,已完成工作的预算成本额为50 关于项目管理的一道分析计算题 T某小区修建一堵围墙,墙体预计长度1000米项目预计总成本:40万元项目规划工期:5工作日/周*10周=50工作日施工以正常的线性速度进行,在项目工期的第20天结束时 《项目管理》计算题求解答,谢谢某土方工程总挖方量为4000立方米.预算单价为45元/立方米.该挖方工程预算总费用为180000元.计划有10天完成,每天400立方米.开工后第7天早晨刚上班时业主项目管 怎么写这几题 很幸福,我要当哥哥了.我想给我的妹妹起个名字,出生2011年6月三十号.早晨9点10分,我希望名字中有希望她长大后能够幸福美丽聪明.希望别太俗就行,如果起的很好的,我会再给分的对了我忘了说 唐家璇:中日关系深层次原因在于彼此认第九届北京―东京论坛26日在北京开幕查尔斯不想当国王? 英媒爆王储担心被河南“猪蹄店要账横幅”事件:欠款已全英媒称斯诺登一机密文件披露美监听35中欧推动世贸组织在MC9上达成早期收福岛近海发生7.1级地震 最大观察到欧洲多国一致声讨美国监听事件 默克尔报效桑梓浙商情深 前三季浙商回归项目福岛近海发生7.1级地震 最大观察到马耳他总统阿贝拉会见杜青林网上传播谣言 滁州天长一女子被罚20没监控、无旁人 长沙好司机捡价值百万长沙海关18项措施支持湖南外贸稳增长长沙芙蓉区:东湖街道举办“大手牵小手岳麓区桔子洲街道重拳出击 整治市容“黄兰香“沪洽周”拜访相关企业 希望寻长沙芙蓉区开展“第四次国民体质检测工18日起湖南开启强降水模式 局地大暴宁夏已完成生态移民搬迁定居22.4万青藏高原冻土过去30年间退缩16%新疆众多农民在产业援疆中实现就业增收
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘