C++之namespace

 

 

错误的是

namespace A
{
    int i = 1;
}
namespace B
{
    void a(void);
    void b(void);
    void c(void);
    void d(void);
}
void B::a(void)
{
    using namespace A;
    i++;

}
void B::b(void)
{
    using A::i;
    i++;
}
void B::c(void)
{
    A::i++;
}
void B::d(void)
{
    i++;
}

 

A.void B::a(void)的函数体中
B.void B::b(void)的函数体中
C.void B::c(void)的函数体中
D.void B::d(void)的函数体中

D

如果没有声明引进其他域的成员,默认访问自己域的成员,但在B域里没有定义i。
名字空间成员访问的三种方法(There are three ways to access the elements of a namespace: by explicit access qualification, the using-declaration, or the using-directive.),只有当前作用域的名字空间中的成员元素才可以直接访问。

 


对于cpp文件中不需要导出的变量,常量或者函数,请使用匿名namespace封装或者用static修饰
在C++ 2003标准规范中,使用static修饰文件作用域的变量,函数等被标记为deprecated特性,所以更推荐使用匿名namespace。

主要原因如下:

static在C++中已经赋予了太多的含义,静态函数成员变量,静态成员函数,静态全局变量,静态函数局部变量,每一种都有特殊的处理。
static只能保证变量,常量和函数的文件作用域,但是namespace还可以封装类型等。
统一namespace来处理C++的作用域,而不需要同时使用static和namespace来管理。
static修饰的函数不能用来实例化模板,而匿名namespace可以。
但是不要在 .h 中使用中使用匿名namespace或者static。

// Foo.cpp

namespace {
    const int MAX_COUNT = 20;
    void InternalFun(){};
}

void Foo::Fun()
{
    int i = MAX_COUNT;

    InternalFun();
}
如果实现热补丁技术,请使用static来解决:
静态函数热补丁,可以通过修改补丁函数的名称为:所在源代码文件名.静态函数名解决。
例如:

// a.cpp内容
static void Foo() {

}
补丁函数名称为:

void a$c$Foo()  // “.”全部用“$”代替
或者定义一个STATIC宏,在调试阶段,将STATIC定义为static,版本发布时,改为空,以便于后续的打热补丁等操作。

#ifdef DEBUG
#define STATIC static
#else
#define STATIC
#endif

参考资料

http://3ms.huawei.com/hi/group/2757573/wiki_5368643.html

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值