错误的是
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