📄 effective c++ 2e item28.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0047)http://www.csdn.net/develop/article/8/8989.shtm -->
<HTML><HEAD><TITLE>Effective C++ 2e Item28</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content=0 http-equiv=Expires><LINK
href="Effective C++ 2e Item28.files/news.css" rel=stylesheet>
<STYLE type=text/css>.fst {
BACKGROUND: #eeeecc; BORDER-LEFT: #000000 1px solid; BORDER-RIGHT: #000000 1px solid; PADDING-BOTTOM: 0px; PADDING-LEFT: 15px; PADDING-RIGHT: 15px; PADDING-TOP: 0px; WIDTH: 770px
}
.fstdiv3 IMG {
BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-RIGHT: #eeeecc 8px solid; BORDER-TOP: #eeeecc 6px solid
}
</STYLE>
<META content="MSHTML 5.00.2614.3500" name=GENERATOR></HEAD>
<BODY aLink=#990000 bgColor=#ffffff bottomMargin=0 leftMargin=0 rightMargin=0
topMargin=0 marginheight="0" marginwidth="0">
<SCRIPT language=javascript1.2>
<!--
var currentpos,timer;
function initialize()
{
timer=setInterval('scrollwindow()',10);
}
function sc(){
clearInterval(timer);
}
function scrollwindow()
{
currentpos=document.body.scrollTop;
window.scroll(0,++currentpos);
if (currentpos != document.body.scrollTop)
sc();
}
document.onmousedown=sc
document.ondblclick=initialize
//-->
</SCRIPT>
<CENTER><LINK href="news.css" rel=stylesheet>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=770>
<TBODY>
<TR vAlign=bottom>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/1.gif"
width=14></DIV></TD>
<TD background="Effective C++ 2e Item28.files/di.gif" height=22>
<DIV align=left><FONT color=#ff6633><A
href="http://www.csdn.net/">CSDN主页</A></FONT></DIV></TD>
<TD bgColor=#001880 height=22 width=185>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/2.gif"
width=70></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/y1.gif"
width=3></DIV></TD>
<TD background="Effective C++ 2e Item28.files/di.gif" height=22>
<DIV align=left><FONT color=#ff6633><A
href="http://www.csdn.net/news/">新闻聚焦</A></FONT></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=15></DIV></TD>
<TD background="Effective C++ 2e Item28.files/di.gif" height=22>
<DIV align=center><FONT color=#ff6633><A
href="http://www.csdn.net/cnshare/">共享软件</A></FONT></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=14></DIV></TD>
<TD background="Effective C++ 2e Item28.files/di.gif" height=22>
<DIV align=left><FONT color=#ff6633><A
href="http://www.csdn.net/buy/">俱乐部</A><IMG
src="http://www.csdn.net/images/buy.gif"></FONT></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=15></DIV></TD>
<TD background="Effective C++ 2e Item28.files/di.gif" height=22>
<DIV align=left><A href="http://www.csdn.net/develop/"><FONT
color=red>开发文档</FONT></A></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=15></DIV></TD>
<TD background="Effective C++ 2e Item28.files/di.gif" height=22>
<DIV align=left><FONT color=#ff6633><A
href="http://expert.csdn.net/">专家门诊</A></FONT></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=15></DIV></TD>
<TD background="Effective C++ 2e Item28.files/di.gif" height=22>
<DIV align=left><FONT color=#ff6633><A
href="http://www.csdn.net/job/">招聘求职</A></FONT></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=15></DIV></TD>
<TD background="Effective C++ 2e Item28.files/di.gif" height=22>
<DIV align=left><FONT color=#ff6633><A
href="http://www.csdn.net/linux/">Linux园地</A></FONT></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=15></DIV></TD>
<TD background="Effective C++ 2e Item28.files/di.gif" height=22>
<DIV align=left><A href="http://www.csdn.net/magazine/">程序员杂志</A></DIV></TD>
<TD height=22 width=11>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/j1.gif"
width=11></DIV></TD></TR></TBODY></TABLE>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=770>
<TBODY>
<TR>
<TD bgColor=#001880 height=5 width=2></TD>
<TD height=5 width=768></TD></TR></TBODY></TABLE>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=770>
<TBODY>
<TR>
<TD bgColor=#001880 width=2></TD>
<TD width=158><IMG border=0
src="http://www.csdn.net/images/csdn_logo.gif"></TD>
<TD align=middle width=470>
<OBJECT classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000
codeBase=http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0
height=60 id=Movie1 width=468><PARAM NAME="movie" VALUE="http://www.csdn.net/images/ad/magazine6_1.swf"><PARAM NAME="quality" VALUE="high">
<EMBED src='http://www.csdn.net/images/ad/magazine6_1.swf' quality=high
WIDTH=468 HEIGHT=60 TYPE='application/x-shockwave-flash'
PLUGINSPAGE='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash'>
</EMBED></OBJECT><IMG border=0 height=0
src="http://www.csdn.net/count/pageview.asp?name=cnshare" width=0> </TD>
<TD align=right width=140>
<SCRIPT>document.write("<img src=http://www.csdn.net/count/pageview.asp?name=develop border=0 width=0 height=0>");</SCRIPT>
<A href="http://www.csdn.net/dev/"><IMG border=0 height=60
src="http://www.csdn.net/develop/images/kfzxt3.gif" width=120></A>
</TD></TR></TBODY></TABLE>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=770>
<TBODY>
<TR>
<TD bgColor=#001880 width=2></TD>
<FORM action=http://www.csdn.net/member/logon.asp method=post target=_blank>
<TD bgColor=#e0dedf vAlign=bottom width=340> 昵称:<INPUT class=from1
name=name size=10> 密码:<INPUT class=from1 name=pass size=10
type=password> <SELECT name=type size=1> <OPTION value=1>我的论坛</OPTION>
<OPTION value=2>我的软件</OPTION> <OPTION value=3>我的订单</OPTION> <OPTION
selected value=4>我的文档</OPTION> <OPTION value=5>我的简历</OPTION></SELECT></TD>
<TD bgColor=#e0dedf vAlign=bottom width=45><INPUT height=17
src="http://www.csdn.net/images/denglu.gif" type=image width=44> </TD>
<TD bgColor=#e0dedf vAlign=bottom width=45><A
href="http://www.csdn.net/expert/zc.asp" target=_parent><IMG border=0
src="http://www.csdn.net/images/zhuce.gif"></A> </TD></FORM>
<FORM action=http://www.csdn.net/find.asp method=post target=_blank>
<TD align=right bgColor=#e0dedf vAlign=bottom width=293><INPUT class=from1
name=search> <SELECT name=type size=1> <OPTION value=1>新闻</OPTION>
<OPTION value=2>软件</OPTION> <OPTION value=3>商品</OPTION> <OPTION selected
value=4>文档</OPTION> <OPTION value=5>论坛</OPTION></SELECT></TD>
<TD bgColor=#e0dedf vAlign=bottom width=45><INPUT height=17
src="http://www.csdn.net/images/sousuo.gif" type=image width=44>
</TD></FORM></TR></TBODY></TABLE>
<TABLE align=center bgColor=#cccc99 border=0 cellPadding=2 cellSpacing=0
width=770>
<TBODY>
<TR>
<TH align=left>Effective C++ 2e Item28
</TH></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#eeeecc border=1 cellPadding=1 cellSpacing=0
width=770>
<TBODY>
<TR>
<TD align=left width=300><B>关键字:</B><BR>Effective C++ </TD>
<TD align=middle width=120><B>贴文时间</B><BR>2001-7-22 10:14:13 </TD>
<TD align=middle width=80><B>文章类型: </B><BR>翻译 </TD>
<TD align=middle width=100><B>给贴子投票 </B><BR><A
href="http://www.csdn.net/develop/addscore.asp?id=8989">投票</A> </TD></TR>
<TR>
<TD> lostmouse 翻译 </TD>
<TD colSpan=3 vAlign=top><B>出处: </B><A
href="http://www.csdn.net/develop/article/8/Effective%20C++%202e%20e-book">Effective
C++ 2e e-book </A></TD></TR>
<TR>
<TD bgColor=#cccc99 colSpan=5> </TD></TR></TD></TR></TBODY></TABLE>
<DIV align=center>
<DIV align=left class=fst>
<DIV class=fstdiv3 id=print2><BR><BR>
<P>条款28: 划分全局名字空间</P>
<P>全局空间最大的问题在于它本身仅有一个。在大的软件项目中,经常会有不少人把他们定义的名字都放在这个单一的空间中,从而不可避免地导致名字冲突。例如,假设library1.h定义了一些常量,其中包括:</P>
<P>const double LIB_VERSION = 1.204;</P>
<P>类似的,library2.h也定义了:</P>
<P>const int LIB_VERSION = 3;</P>
<P>很显然,如果某个程序想同时包含library1.h和library2.h就会有问题。对于这类问题,你除了嘴里骂几句,或给作者发报复性邮件,或自己编辑头文件来消除名字冲突外,也没其它什么办法。</P>
<P>但是,作为程序员,你可以尽力使自己写的程序库不给别人带来这些问题。例如,可以预先想一些不大可能造成冲突的某种前缀,加在每个全局符号前。当然得承认,这样组合起来的标识符看起来不是那么令人舒服。</P>
<P>另一个比较好的方法是使用C++
namespace。namespace本质上和使用前缀的方法一样,只不过避免了别人总是看到前缀而已。所以,不要这么做:</P>
<P>const double sdmBOOK_VERSION = 2.0; //
在这个程序库中,<BR>
// 每个符号以"sdm"开头<BR>class sdmHandle { ...
};
</P>
<P>sdmHandle&
sdmGetHandle();
//
为什么函数要这样声明?<BR>
// 参见条款47</P>
<P>而要这么做:</P>
<P>namespace sdm {<BR> const double BOOK_VERSION = 2.0;<BR> class
Handle { ... };<BR> Handle& getHandle();<BR>}</P>
<P>用户于是可以通过三种方法来访问这一名字空间里的符号:将名字空间中的所有符号全部引入到某一用户空间;将部分符号引入到某一用户空间;或通过修饰符显式地一次性使用某个符号:</P>
<P>void f1()<BR>{<BR> using namespace
sdm; //
使得sdm中的所有符号不用加<BR>
// 修饰符就可以使用</P>
<P> cout <<
BOOK_VERSION; //
解释为sdm::BOOK_VERSION<BR> ...</P>
<P> Handle h = getHandle(); //
Handle解释为sdm::Handle,<BR>
// getHandle解释为sdm::getHandle<BR>
...
</P>
<P>}</P>
<P>void f2()<BR>{<BR> using
sdm::BOOK_VERSION; //
使得仅BOOK_VERSION不用加<BR>
// 修饰符就可以使用</P>
<P> cout <<
BOOK_VERSION; //
解释为<BR>
// sdm::BOOK_VERSION<BR> ...</P>
<P> Handle h =
getHandle(); // 错误!
Handle和getHandle<BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -