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

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

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


额,不会去整个名字空间去找的。
用vb.net写的验证码识别代码 VB删除EXCEL表格指定列 Oracle数据库Windows 2003环境自动备份批处理 VB通过ADODB连接EXCEL表格文件读取数据 使用VBScript卸载软件 Discuz X2用户注册过程SQL Android手机参数表 用jQuery改变图片(image src) 用std::atomic實現簡單的讀寫鎖 ChinaPay网上支付网关.NET开发 VOB生成IFO文件用nero刻录DVD详解 15款开源Android游戏引擎(安卓免费游戏引擎) 将MVC ASPX转换到Razor视图 Word设置目录简明教程 asp.net mvc页面javascript代码中如何使用razor Discuz X论坛数据表结构:用户数据表pre_common_member boost在windows平台下自带超强 IOCP 的ASIO Boost下载和编译安装简明指引 Windows和Linux环境中Boost下载安装编译配置使用指南 Android开发技巧:Android常用类库说明 Android开发技巧:Android 文件系统 Android开发技巧:Android应用程序架构 ASP.NET MVC Razor 输出没有编码的HTML字符串 ASP.NET MVC 3 Razor 在head里包含js文件 JQuery mobile介绍 JQuery Mobile 页面结构 什么是云计算的通俗理解 什么是Hadoop以及与云计算的关系 创建一个Windows Phone 7推箱子益智游戏 好用的在线编辑器百度UEditor ASP.NET如何从URL或route数据中得到controller类型和action信息 不好意思,怎么把引号赋给一个变量?thank 关于字体的保存,用序列化 关于oracle连接的一个简单问题 一个构件地址35分,快快来吧。 如何实现实时监测注册表的变化呢??????????? 如何锁定一个SQL SERVER的表? 哪里有Rose2000? MMGG Redhat7.2Ftp,硬盘安装问题求救! 请问怎样设置phpmyadmin带用户名和密码的登陆界面? 本来打算跳楼的,想想还是先来这试试...... 下面代码有什么用? 想问一下关于BDE和ADO组件的对应关系 就是这本《VC++技术内幕》……哎……我认了…… MSSQL2000 为什么我的log文件拼命往上涨 如何将用jsp得到的数据用javascript显示出来? 关于画声音波形曲线的问题.高手请帮帮忙(效果像flash加入声音时那样) TNND , 连个回复都不行 , 真恶心 (yeti_lee) 信用卡代理网站的可靠性 关于sqlserver联接问题帮一下了在线等待 小问题,高分啦!!:) 真的没有高手么,真的没人会么? 我为了使鼠标指向SpeedButton上时它的Caption颜色改变,在SpeedButtonMouseMove()和PanleMouseMove()中写了代码,但是很不敏感,鼠标移动快一点,就会有延时? 如何在Delphi5种调用windows自身的拨号网络实现点到点通过modem连接 回贴老是出错(该页无法显示。。。),试试发主贴怎么样。 哎!!!!帮帮忙吧!!!!!!! 高分求助!!!谁能告诉我在ASP下上传任意文件? 一个很菜的问题,和var有关 关于其他数据表/库文件转换进MySQL库的问题 请问在win98 下面安装 SQL Server 7.0 DESKTOP版 需不需要哪台机有网卡?? 关于网络设计师考试? 再发一次吧。昨天发晚了,人少.比较BCB和DELPHI我差点哭了,原来是这样,我以前的看法错了。BCB,你的路还长.BCB真比DELPHI慢得多,你们认为呢,有谁一起比过呢?来说说吧 对于SDK(win32 api)精通、熟悉、了解或者正在努力中的同志,希望能多多交流.qq:4911756 如何控制2000域用户上网权限 有没有用来关闭计算机的函数或消息呀! 很菜的问题,不要错过机会阿。拿分把 请问从哪里可以下载到免费的jsp的编译软件,谢谢帮忙!! 难得问问题,给个高一点的分,win95下的驱动程序怎么移植到windows me下面?(问题圆满解决可以加到400分,剩这么点了,呵呵) 谁能告诉我几个Activex控件的下载网址,我给他分 关于dll在代理中的运行问题?(H) 分在里面拿!http://www.csdn.net/expert/topic/374/374827.shtm 在程序员大本营的2001borland版上有一个插件叫maxspace,谁帮忙破解一下时间限制? 救命啊!sos..sos.. 我快不行拉! 哪里有wise for windows installer的使用说明? 遍历表字段名的问题? 上传文件是否可以设置默认文件? 谁能告诉我几个Activex控件的下载网址,我给他分!!!! 能否提供些,好书(数据库方面),好的学习DELPHI的网站 怎样判断闰年,有原代码吗 怎么样获得鼠标是否在一个控件上的事件。 我用的是RetHat7.2的Gnome桌面,问题多多? 40-50字读书感言怎么写? 水浒传第57回500字简介和50字读后感徐宁教使钩镰枪 宋江大破连环马 是这一章么大哥 要写关于运动会的作文,帮忙想个作文题目. 阅读西游记并写出幸福的感受300字 好的我给50 快30分钟写出来快,我给50270字就行快 水浒传单个小故事的读后感,每篇50~100字 成功的秘诀是什么?读短文“拼命吹!”风说.“要能拍!”照相机说.“要罩得住”蚊帐说.“无孔不入”钉子说.“口锋要锐利.”刀子说.“容量要大.”冰箱说.“永远保持冷静.”冷气机说. 读书感言 50字 老师让写一篇以“爱”为话题的作文(题目自拟).作文高手进.我觉得这些都 太俗了.有没有新颖一点的.要带题目的、、、 成功的秘诀是什么? 怎样写自己的文章,必须300字到400字是必须300 400,五百也行,最好是提纲 ,重点是外貌和特点. 描写高中老师作文题目、要求幽默点或者新颖点别整什么“明灯”啊、“蜡烛”啊俗的、要与众不同! 用英文写“读《安徒生的童话》有感”200字左右.要中文 我的好朋友作文写一下谢 我是90 后作文800字绝对 独一无二 不要抄 感悟自信 短文300字左右 怎样辅导写我的好朋友的作文 自信,成功的秘诀(作文)5百字以上 我渴望自信 300字作文 写我的好朋友 作文 可以从哪几个方面写 作文【成功的秘诀】 求初中作文《我的好朋友》!急求初中作文《我的好朋友》!要写有营养的!不要千篇一律的! 请以“微笑”为话题写一篇作文(题目要有微笑两字)不少于500字 我找到了成功的秘诀作文 我的好朋友1000字初中作文怎么写还有和她最难忘的事 江姐读后感 300字左右 张士骏的《童话大师安徒生》的读后感,100字左右就行了.读了这篇文字,你有哪些感受?受到了哪些启发,把想法写出来!500多字吧!好的话,可以把分提到150 令我难忘的一天 800字范文要有点内含的啊.至少是初三学生的水平. 江姐的事迹(30~50字)越少越好! 安徒生童话故事卖火柴的小女孩读后感 文明礼仪我先行 初中作文1000字 一篇《江姐》的读后感 3000字 我的好朋友作文600字有用的 有关于奉献生命的作文题目 西游记读后感30~50字 自信的作文300字 生命因什么而精彩怎么写 我的好朋友作文怎么写 我的好朋友作文500字都没一个好的 最顽强的生命 作文要500字 给个300 400左右字有哲理的文章字不要太多,不要太幼稚的! 以“信心”为话题的800字作文跪求一篇以“信心”为话题的八百字作文.望好心人帮助.悬赏20分. 关于“生命”的内容的作文题目星期一要交, 求《给自己一个微笑》的800字作文, 关于自信的作文400字以上急用 读了张士俊的《童话大师安徒生》的读后感急,500字,一小时内有效. 以珍爱生命为话题的作文题有哪些 急. 以自信为话题的作文,800字左右! 找回自信 请以“生命的芳香”为话题,写一篇文章.800字左右, 我的好朋友作文500字左右 写运动会的作文题目有? 我要一篇以“生命的芳香”为话题的600字作文.在后天就要.不能以“生命的芳香”为题目.必须要是600字以上或600字. 作文:我的好朋友!600字左右! 谁能帮我想一下关于运动会的作文题目吗一定要新颖啊 ,一定要让人过目难望 以“生命的芳香”为题的作文初一水平的,600字就够了. 读 有感50字 运动会作文题目 请用“生命的芳香”为题 写一篇作文. 求水浒传每回的读后感(大概50-80字)5-8、10、11、13、15、17、18、19回的.(是读后感,不是内容哦!)如果符合要求,我会给分的.:) 写运动会的作文题目该写什么
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn