靜態變量具有文件內部的範圍僅在那裏它們被被聲明,如示於以下代碼:靜態成員變量文件範圍
file1-
static int a;
file2-
extern int a;
這會導致鏈接錯誤,因爲靜態變量a僅在file1中具有範圍。但我很困惑與下面的代碼:
file2-
#include "file1"
extern int a;
這不會給任何連接錯誤。那麼它意味着編譯器引用了在file1中聲明的「a」。但是當你調試時,你會發現變量「a」的地址在file1和file2中是不同的。編譯器是否在file2中創建另一個全局變量「a」?
完整的代碼 -
文件temp1.h -
static int w = 9;
class temp1
{
public:
temp1(void);
public:
~temp1(void);
void func();
};
........................ .. CPP ...............
temp1::temp1(void)
{
int e =w;
}
temp1::~temp1(void)
{
}
void temp1::func()
{
}
............................ ........... file2-
#include "temp1.h"
extern int w;
int _tmain(int argc, _TCHAR* argv[])
{
w = 12;
temp1 obj;
return 0;
}
在這裏,當我調試和檢查temp1構造函數和file2中的值和adrress是不同的。
除非'temp1.h'包含自身,否則該代碼不完整(或可能不正確)。你能顯示'temp1.h'的內容嗎? – 2011-06-05 14:03:29
發佈編輯,我想我的回答完全回答你的問題。在兩個翻譯單元中,'w'具有_internal linkage_,因爲頭文件中包含的'w'是'static int w = 9;'聲明的第一個聲明。這意味着兩個翻譯單元都有自己獨特的獨立「w」。 – 2011-06-05 14:35:26
所以這意味着第二個翻譯單元也定義變量w,即使它是外部的(因爲它不會導致重新定義,因爲第一個定義是翻譯單元1中的內部連接)? – 2011-06-05 15:13:23