静态变量在该文件中的范围仅在声明它们的位置,如下面的代码所示:
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中的值和地址是不同的.
static而extern没有做的文件,他们有做翻译单元.请记住,当你#include有所作为时,预处理器正在有效地进行复制和粘贴. static等等,是指该过程的结果,即翻译单元.
所以在你的第二个例子中,只有一个翻译单元.所以只有一个变量a. [但请注意,这样做是非常糟糕的风格.]