静态成员变量文件范围

G M*_*ann 3 c++

静态变量在该文件中的范围仅在声明它们的位置,如下面的代码所示:

file1-

static int a;
Run Code Online (Sandbox Code Playgroud)

file2-

extern int a;
Run Code Online (Sandbox Code Playgroud)

这将给出链接错误,因为静态变量a仅在file1中具有范围.但我对以下代码感到困惑:

file2-

#include "file1"
extern int a;
Run Code Online (Sandbox Code Playgroud)

这里不会给出任何链接错误.然后它意味着编译器引用在file1中声明的"a".但是当你调试时,你会发现变量"a"的地址在file1和file2中是不同的.编译器是否在file2中创建另一个全局变量"a"?

完整代码 -

文件temp1.h -

static int w = 9;

class temp1 
{
public:
   temp1(void);
public:
   ~temp1(void);

   void func();

};
Run Code Online (Sandbox Code Playgroud)

........................ CPP .................

temp1::temp1(void)
{
   int e =w;
}

temp1::~temp1(void)
{
}
void temp1::func()
{
}
Run Code Online (Sandbox Code Playgroud)

....................................... file2-

#include "temp1.h"

extern int w;
int _tmain(int argc, _TCHAR* argv[])
{
   w  = 12;

   temp1 obj;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这里当我调试并检查temp1构造函数和file2中的值和地址是不同的.

Oli*_*rth 7

static而extern没有做的文件,他们有做翻译单元.请记住,当你#include有所作为时,预处理器正在有效地进行复制和粘贴. static等等,是指该过程的结果,即翻译单元.

所以在你的第二个例子中,只有一个翻译单元.所以只有一个变量a. [但请注意,这样做是非常糟糕的风格.]