C++命名空间namespace - 商帝国咨询 - 五略商书

C++命名空间namespace

商帝国咨询头像

阅读 15185 | 分类:文章

C++命名空间namespace
9 @* @; h% C/ d1 \1 J" H$ K5 k( z3 m9 y3 |# R' m, o

% i; C' e; i- ?4 T$ E在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。 4 E9 K4 _0 C; M9 g

, Z( N* F' p8 ^* o/ NMFC中并没有使用命名空间,但是在.NET框架、MC++和C++/CLI中,都大量使用了命名空间。2 |- t4 H$ V4 A8 d1 y8 \
1)作用域与命名空间
3 v! h( Y" T/ c$ v1 I, e<!--[if !supportLists]-->l         <!--[endif]-->相关概念8 P& q1 @! W  _' T' j8 p' c
与命名空间相关的概念有:
* L" ?6 e  S; A) \% ?) l; d% \, w<!--[if !supportLists]-->n       <!--[endif]-->声明域(declaration region)—— 声明标识符的区域。如在函数外面声明的全局变量,它的声明域为声明所在的文件。在函数内声明的局部变量,它的声明域为声明所在的代码块(例如整个函数体或整个复合语句)。/ F, V- K4 K/ u# B: g# N& b; R: I
<!--[if !supportLists]-->n       <!--[endif]-->潜在作用域(potential scope)—— 从声明点开始,到声明域的末尾的区域。因为C++采用的是先声明后使用的原则,所以在声明点之前的声明域中,标识符是不能用的。即,标识符的潜在作用域,一般会小于其声明域。8 t5 ?6 m$ f' K1 {) `
<!--[if !supportLists]-->n       <!--[endif]-->作用域(scope)—— 标识符对程序可见的范围。标识符在其潜在作用域内,并非在任何地方都是可见的。例如,局部变量可以屏蔽全局变量、嵌套层次中的内层变量可以屏蔽外层变量,从而被屏蔽的全局或外层变量在其倍屏蔽的区域内是不可见的。所以,一个标识符的作用域可能小于其潜在作用域。
( u/ m  x- d' @  n5 d3 A9 L" u0 H3 A6 w, O; l& ^  }' ]% [$ R$ H$ R
<!--[if !supportLists]-->l         <!--[endif]-->命名空间
! ~8 t: `' {' [8 U: A) Z# Y命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个集团的声明放在同一个命名空间中。
8 s# m  m- y9 ?* P- \7 I% d原来C++标识符的作用域分成三级:代码块({……},如复合语句和函数体)、类和全局。现在,在其中的类和全局之间,标准C++又添加了命名空间这一个作用域级别。
: p/ H2 ^, y; y- W0 F命名空间可以是全局的,也可以位于另一个命名空间之中,但是不能位于类和代码块中。所以,在命名空间中声明的名称(标识符),默认具有外部链接特性(除非它引用了常量)。
+ n/ v( t% }$ ~+ J0 T8 _; j在所有命名空间之外,还存在一个全局命名空间,它对应于文件级的声明域。因此,在命名空间机制中,原来的全局变量,现在被认为位于全局命名空间中。0 @1 y0 |5 d% p5 w4 S
标准C++库(不包括标准C库)中所包含的所有内容(包括常量、变量、结构、类和函数等)都被定义在命名空间std(standard标准)中了。& ]/ T- C2 F5 t# y0 H9 |) S% y) W
2)定义命名空间
3 c- n! c6 g+ p$ r, ^9 G& k有两种形式的命名空间——有名的和无名的。, t4 p7 T  |# j: x7 x: S
命名空间的定义格式为:(取自C++标准文档)3 r1 s' v/ r) U8 ]* a) _
named-namespace-definition:' j: d/ e) d  h+ i4 n1 |
       namespace identifier { namespace-body }( q( L! {$ _! b/ `
unnamed-namespace-definition:
- {# R1 U% l1 F1 N, B       namespace { namespace-body }
0 N1 i! [8 J: P( u0 {* |2 h% _namespace-body:
! ^; T) ?* P0 l# C, d       declaration-seqopt2 @6 D5 x) I5 |& q+ e: o- B/ R2 K2 o3 s
即:(自己翻

留言区(共0条)

暂无留言,快来抢占沙发~
作者声明:非原创
平台声明:文章及评论仅代表作者本人观点,五略商书系信息发布平台,仅提供信息存储空间服务,如有侵权,请联系13521509118。转载请注明作者和出处:转自五略商书m.shangdiguo.com,作者商帝国咨询!