通常我们都不太赞成使用全局变量,但有时确实也避免不了。每当使用全局变量或对象时,决不要在头文件中实例化,因为头文件一般都被包含(#include)在几个源文件中。这样,链接器将扫描到相同对象的多个实例并报错。必须在单个源文件中实例化全局变量或对象,只有这样才能保证它只被定义一次,而与工程中使用的源文件数目无关。所有其它的存取该全局对象的源文件和头必须以extern方式来声明。下面是一个例子:
// File a.h
/*仅仅声明; x 的定义在另外一个源文件中*/
extern int x;
struct Counter
{
Counter() {++x;}
~Counter() {--x;}
};
// File b.cpp
int x; //定义全局变量
// File main.cpp
#include "a.h"
int main()
{
Counter count;
cout<<"value of x is: "<<x;
}
两个源文件 b.cpp 和 main.cpp 被单独编译。链接时,链接器确定所有定义在b.cpp文件中对x的引用。
// File a.h
/*仅仅声明; x 的定义在另外一个源文件中*/
extern int x;
struct Counter
{
Counter() {++x;}
~Counter() {--x;}
};
// File b.cpp
int x; //定义全局变量
// File main.cpp
#include "a.h"
int main()
{
Counter count;
cout<<"value of x is: "<<x;
}
两个源文件 b.cpp 和 main.cpp 被单独编译。链接时,链接器确定所有定义在b.cpp文件中对x的引用。