Google C++编程规范(二)————(作用域篇)

 

作用域

名字空间(namespace

cpp源文件里面,经常鼓励使用匿名空间(Unnamed namespaces),或者使用项目名字或路径名字作为namespace。不要直接使用using using-directive)。

(译者注: 匿名空间 Unnamed namespaces 后面有解释)

定义(Definition

Namespaces 将全局作用域细分为不同的作用域,可有效防止命名冲突。

优点(pros

Namespaces 提供了继承轴线,当然,类的名字也提供类似的功能。

举个例子来说,两个不同project中都有Foo类(在全局空间下),这样在编译或运行时期,就会冲突,不知道使用哪一个Foo才是想要的那个。如果每个project都使用一个自己的namespaceproject1::Foo  project2::Foo这样就不会产生冲突,namespace把他们分成两个不同的类了。

(译者注:文章中说编译和运行期间,个人认为只会在编译期间产生冲突, 在编译时候 project1::Foo project2::Foo 实际上被编译器把他们改成类似如 上两个不同的类, 编译期通过,运行期就没有任何问题)

 

缺点(cons

不好理解,有时候第一眼看上去,很难区分是个域名还是一个类名,而且在头文件中使用匿名空间容易违背C++ODR原则(One Definition Rule (ODR)

结论(Decision

根据下面策略合理使用名字空间

*     匿名空间(Unnamed namespaces

匿名空间是被允许甚至鼓励在cpp文件中使用,有效的防止名字冲突

namespace {                           // This is in a .cc file.
 
// The content of a namespace is not indented
enum { kUnused, kEOF, kError };       // Commonly used tokens.
bool AtEof() { return pos_ == kEOF; }  // Uses our namespace's EOF.
 
}  // namespace

 

匿名空间具有文件域相关性,即只有该文件内的代码才可以访问匿名文件中的类型和变量,其他文件是无法访问的.

(译者注: 一般说来,可以使用匿名空间代替static。如下面代码:

  namespace {int a = 2;}
   static int a = 3;
   
   这两行代码所起的作用是一样,只有本文件中代码才能使用。
  有聪明的同学问,可不可以2句话同时存在,那使用a变量的时候到底用哪一个呢。呵呵自己试一试吧,理解namespacestatic区别

不要在头文件中使用匿名空间。(译者注:违反ORD原则)

*     有名空间(namespace

有名空间应该如下使用

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值