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

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

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


额,不会去整个名字空间去找的。
Marissa Mayer为何带雅虎重回门户时代? 开发者最爱的三款开发工具 Facebook开源JavaScript库:React 硬件天堂深圳行:从Seeed Studio、Knewone到柴火创客空间 消费应用开发难赚钱?做个企业app store吧 开发开源软件的智慧:够简单,很好用 历届中国云计算大会PPT集萃(终章):架构到实践的全面解析 透过现象看本质:详谈数据可视化 专家观点:HTML5无法彻底抹杀Native应用 Google地图工程主管Raj Shah跳槽至微软在线服务部门 微软证实Windows 8.1引入类“开始”按钮 系统6月26日开放下载 PHP开发者意向调查:移动开发+云服务成为焦点 研发周报:16种折磨开发者的方式 移动周报:Jolla和Sailfish OS,那些你应该知道的事儿 优化技巧分享:把内存消耗降低至原来的1/20 85后程序员:独自一人,完成一个HTML5开源图形库 关于Waze的前世今生,你所不知道的事 代码审查——提高代码质量的终极武器 值得开发者关注的8个HTML5 API 最初设计方案大公开!LINE STAMP 贴图诞生记 安全宝联合华为成立抗D联盟 储备防御带宽达110G 专访中科院贾海鹏:给异构开发者的六个建议 我们死后的遗留数据将会如何处理? 传微软考虑重大重组 或势在必行 云适配CEO陈本峰:8年磨一剑 Splashtop企业应用:SplashApp让办公移动起来 时空旅行+内付费“植物大战僵尸2”下月18日全球同步发行! 中移动推网络电话Jego 后来者能否居上? 防止数据泄露:BYOD下的管理员5大妙招 咕咚副总裁司建铭谈移动时代的“软硬整合” 未来的物联网结点:可穿戴设备 2000和xp 共享的问题? 怎么通过netmeeting连上广域网的主机? 能不能将一个文件夹下的图片进行批量上传? 字符串问题: 有关结束进程的问题 谢谢高手 怎样才能学好c语言这门课 帮帮我吧—— 一个简单的问题! 怎样调用Twain设备照相,并将照片放在一个picturebox中 怎样在数据表中查询在某个范围内共有几条记录?(好象很弱的问题) 一个jbuilder的问题[求助] default.asp有IFRAME里面包含list.asp页,list.asp里的链接如何给default.asp传递一个值并刷新它? ★★★如何在界面线程中调用主线程的对象★★★ 如何让jbuilder生成的文件,在没有jbuilder环境的机器上运行? 有人能吧“准女友胸太平”和“一个程序员的艳遇”粘贴后发成贴子吗,我的机子配置差,打不开。估计这种方法可以。谢谢 问有关窗体的参数属性 学计算机的是不是出去闯比较好!但是听到很多大学同学讲,在外面也不容易!很矛盾! ?WSAWaitForMultipleEvents如何退出 在ASP.net怎么用MessageBox啊?? 俺向大家请教一个问题,可以送分! 真无奈,恳求大家帮我! 接下来我应该干什么????!!! 小女子关于数据库连接的一点看法,请指教 请问如何将一个结构体和listview绑定??绑定后listview是不是相当于一个结构体数组 请问各位兄弟:怎样在 本地机打开XML语言的网页 如何在数据窗口的列名的上方家一行标题, 200分寻找fastReport,有的快进。 关于打印的问题 how are you?????????????????/ 一个小问题,请大家帮帮忙! 如何才能实现左边导航条菜单的样子?(www.csdn.net 左边的) JBuilder7.0+weblogic7.0+jsp+编译时为何出错???? 提取文件信息 配置我感兴趣论坛里面的Dreamweaver写成Dreamwaver 在delphi的form中如何根据登陆用户的权限disable/enable Form中的控件 打印问题 请教各位gg很菜很菜的怪怪问题~~~~~~~~~~~*^-^* 关于函数调用 一个有关文件名的问题 为什么出现这种错误?? javascript高手请进!!! 复杂的表格怎样做成报表(vb和access) 请教问题,高手请进! 关于安装的制作! asp能否调用vc写的dll?急急急急 求教一些菜问题,大家帮帮忙! 高手请进,小弟有难!!! win98 ie怎么不能打开网页? 请教关于使用DataSet的数据更新的问题! 为什么原来运行的好好的程序现在老提示“安装后运行”? 高手进来看看--------JB7.0的字体问题 vc++界面开发简单方法 台湾花莲昨晚发生6.7级地震 台州各上海让全班学生互扇耳光老师被解聘就业市场前三季度逆势走稳 未来总量存日本最新型潜艇“黑龙”下水 苍龙级潜教皇被爆长期遭美监听 意大利梵蒂冈 上海摊位占道多年难除 城管称有保护伞上海自贸试验区注册地不小于20平方米江苏:物业费不满3年就涨 业主可要求南京鼓楼推行公务自行车 评论:别止于温州全省首推非现场记分交通违法网上处南京“礼让斑马线”行动满月 109人黑龙江非转基因大豆产业遇危机:加工一苏州一公交司机工作时猝死 安全停车2专家:房产税遗产税的推出应逐步探索小狗“旺财”被遗弃后痴等主人 从春天实拍!迪拜七星酒店上的高空原地转圈烧四川竹溪村十余年频现盗尸 24小时守欧盟成立20周年一体化频遭挑战 经济中国珠算进入2013年联合国人类非物日本最新型潜艇“黑龙”举行下水仪式俄八旬老汉野外斗熊 被摔下悬崖后逃出期待!Adobe将发布手机版Phot股市暴跌到3000以下,然而却隐藏了iPhone 6s终于来了!苹果正式给我一间这样的工作室,我再也不想去上男子受伤 寻找9月4日晚龙塘高速路口【第396期】手工DIY创意字母,太不文明行为:倪映典烈士纪念塔被喷涂黑拒绝买A货!创意DIY只需100元就这位老奶奶花了2万美元,买了架破飞机原来制作一座沙堡乐趣无穷!阿诺虽然老了,儿子却接班成了新一代男iPhone 6s即将发布 这些猛料科客晚报 9.9苹果喊你看发布会,索亲民易用剁手可选 三纬da Vinc次新股业绩分化明显 资本动作频现!养老金入市 这5大板块将受青睐(附个外资抄底都买啥了?(附股)腌咸鸭蛋《梦幻西游2》新资料片曝光 或将国庆马赛有意扎扎,尤文不想放人?贝尔:球迷对我很好,我会拼尽全力
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘