簡體   English   中英

static 成員變量文件 scope

[英]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 中的值和地址時是不同的。

staticextern文件無關,它們與翻譯單元有關。 請記住,當您#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 ,則每個翻譯單元( file1file1 + file2 )將有自己的不同變量,稱為a

請注意,如果您使用過extern int a; 其次是static int a; 那么這將是一個編譯錯誤,因為如果先前的聲明不可見,則第一個聲明將聲明a具有外部鏈接,然后第二個聲明和定義將導致錯誤,因為static int a; 會與之前的聲明沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM