[英]static member variable file scope
Static 變量只有在聲明它們的地方才有 scope 變量,如下面的代碼所示:
文件1-
static int a;
文件2-
extern int a;
這將導致鏈接錯誤,因為 static 變量 a 僅在 file1 中具有 scope。 但我對下面的代碼感到困惑:
文件2-
#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();
};
……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
temp1::temp1(void)
{
int e =w;
}
temp1::~temp1(void)
{
}
void temp1::func()
{
}
.............................文件2-
#include "temp1.h"
extern int w;
int _tmain(int argc, _TCHAR* argv[])
{
w = 12;
temp1 obj;
return 0;
}
在這里,當我調試和檢查 temp1 構造函數和 file2 中的值和地址時是不同的。
static
和extern
與文件無關,它們與翻譯單元有關。 請記住,當您#include
某些內容時,預處理器實際上是在進行復制和粘貼。 static
等是指該過程的結果,它是一個翻譯單元。
所以在你的第二個例子中,只有一個翻譯單元。 所以只有一個變量a
。 [但請注意,這樣做被認為是非常糟糕的風格。]
文件1:
static int a;
文件2:
extern int a;
這里引用了兩個變量。 第一個是file1
中具有內部鏈接的變量的聲明和定義; 第二個是僅在file2
中聲明具有外部鏈接的變量。 這不一定會導致錯誤; 在某些翻譯單元中使用具有外部鏈接的變量以及在其他翻譯單元中使用具有內部鏈接的同名變量是完全合法的。 只有在file2
中使用a
並且在file2
或程序中的任何其他翻譯單元中沒有此a
的定義時,才會發生任何鏈接錯誤。
#include "file1"
extern int a;
在此示例中,您已將兩個文件合並為一個翻譯單元。 由於static
,變量a
首先在具有內部鏈接的file
中聲明和定義,第二個只是重新聲明,不會改變先前的鏈接。 在這種情況下,第二個聲明是多余的。 如果您仍在分別編譯這兩個文件以及從file2
中包含file1
,則每個翻譯單元( file1
和file1 + file2
)將有自己的不同變量,稱為a
。
請注意,如果您使用過extern int a;
其次是static int a;
那么這將是一個編譯錯誤,因為如果先前的聲明不可見,則第一個聲明將聲明a
具有外部鏈接,然后第二個聲明和定義將導致錯誤,因為static int a;
會與之前的聲明沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.