2010-08-07 43 views
2

這是一個相當複雜的情況。我有一個靜態指針坐在我的一個頭文件中。無處不在,這就是爲什麼我把它作爲一個靜態指針。所以我可以在我的主函數中快速初始化它,以便其他文件可以使用它。全局靜態指針問題

問題是這樣的,即使在我初始化它並將東西放入它之後。其他文件只能找到NULL。就像每個包含帶有靜態指針的頭文件的文件都爲它自己創建一個副本,甚至當其他人初始化它時,每個文件都有自己的獨立副本。否定性目標,即具有全局變量的目的。

我該如何處理這個問題?也許我正在理解一個靜態變量錯誤,或者是因爲它的指針?

我應該聲明它爲:& variable = 5;或者只是變量= 5;或者& variable =(int)5?

回答

12

就像每個包含帶有靜態指針的頭文件的文件都爲其自身創建一個副本,甚至當其他人初始化它時,每個文件都有自己的獨立副本。

這就是static在命名空間範圍應用於變量時的含義:變量被賦予內部鏈接,使其對給定的翻譯單元(源文件)是「本地」。

如果在頭文件的命名空間範圍內有一個static變量,並且將該頭文件包含在多個.cpp文件中,則會有多個該變量的實例:每個包含頭文件的.cpp文件一個文件。

如果你想要一個跨多個源文件共享的全局變量,你需要使它變成extern。在頭文件中聲明變量爲extern,然後在您的.cpp文件中定義extern變量。

+0

您與wilx一起回答是正是我需要的。謝謝你,先生 – Overseer10 2010-08-07 19:14:08

1

定義全局指針static會導致C++編譯器爲每個翻譯單元創建一個單獨的指針,該定義包含在其中。我敢肯定,這不是您想要的,而是您遇到問題的原因。

您應該在頭文件中聲明它extern並在一個cpp文件中定義一次。

我可以想象,混淆來自於,static關鍵字在classstruct定義。事實上,它在那裏的工作方式不同,它會創建一個變量,通用於所有classstruct的實例。

Btw。如果你真的想要一個變量只在一個翻譯單元中可見,推薦的方法是將ii放入一個匿名名稱空間中。 static也適用,但不推薦使用它。

7

是的,你正在理解關鍵字static錯誤。名稱空間和文件範圍中的靜態關鍵字聲明一個變量,該變量僅在翻譯單元(基本上是單個.cpp文件及其所有包含文件)內部可見的地方聲明。通過在頭文件中聲明一個用於多個.cpp文件的靜態變量,可以有效地定義多個變量。

如果你想有一個全局指針,然後在單頭聲明它沒有externstatic在一個.cpp文件中定義它沒有externstatic。例如: -

foo.h中:

extern int * p; 

和main.cpp中:

int * p = something;