1.在不使用名称空间的情况下,为了避免出现链接错误,应该使用以下方法处理全局变量:
在a.h中:
extern int x; //全局变量的声明
在a.cpp中:
#include "a.h"
int x = 0; //全局变量的定义
则在包含了a.h的b.cpp中,可以直接使用该变量:
#include "a.h"
cout << x;
在声明extern变量之后一定要对变量进行定义,并且定义和声明的作用域要相同,否则也会导致链接出错。
2.然而,在使用名称空间的情况下,C++有“使用名称空间中声明的变量代替外部全局变量”的指导原则,对此只需要将不使用名称空间的写法的代码包含在某个名称空间中即可,具体写法如下:
在a.h中:
namespace XSpace
{
extern int x; //全局变量的声明
}
在a.cpp中:
#include "a.h"
namespace XSpace
{
int x = 0; //全局变量的定义
}
则在包含了a.h的b.cpp中,可以通过该名称空间使用该变量:
#include "a.h"
using namespace XSpace;
cout << x;
可以发现,使用名称空间的情况下定义和声明的作用域也应相同(即在该名称空间内),而b.cpp在获得XSpace许可之前也无法使用变量x,体现了该指导原则的保护作用。