2014-02-24 125 views
3

我的問題是關於在共享庫內部創建的靜態變量(靜態void *)(我們稱之爲庫'S'),但它是一個內部變量,並未在外部顯示,但每次調用API都依賴於它。現在讓我們考慮一個案例,當一個程序(我們稱之爲主程序)鏈接到另外兩個共享庫,並且它們中的每一個都與庫S鏈接時。現在我們的主程序的靜態變量會發生什麼變化?它有一個實例嗎?二?共享庫內部的靜態變量

+0

有「會是一個實例,因爲你宣佈它作爲一個靜態 – tarzanbappa

+0

相關:http://stackoverflow.com/questions/3186926/shared-global-variable-in-c-static-library?rq = 1 – Suma

+0

@Suma如何回答你提到的問題對我有幫助? – zoska

回答

3

假設您的靜態變量僅在一個翻譯單元中定義,它將只存在一次,因爲共享庫只在該過程中加載一次。

如果使用sharedstatic鏈接的混合物,這會變得更加困難。

+0

感謝您的幫助! – zoska

0

編譯器爲每個全局靜態變量甚至創建一個不同的實例,當您有幾個具有相同名稱的變量時。

事實上,編譯器(或者可能是預處理器)根據聲明它的源文件的名稱隱式地改變每個這樣的變量的名稱。

您可以通過在頭文件中聲明全局靜態變量來證明這一點,然後將此頭文件包含在幾個不同的源文件中。嘗試在每個源文件中將其設置爲不同的值,並且您會看到該變量在每個源文件中保留其不同的值。

+0

我不認爲這是這個問題的關鍵。沒有理由認爲靜態變量在代碼中有多個定義。 – Suma

+0

@Suma:謝謝你的倒票。請在答案底部嘗試一下建議,如果你證明我錯了,我保證刪除這個答案! –

+0

我明白你在寫什麼,並且你是正確的,但是沒有理由認爲OP已經在頭部或多個翻譯單元中定義了變量。 – Suma

6

Suma的回答是正確的。只有一個靜態變量的實例。這也是爲什麼在共享庫中使用靜態全局變量可能是一個巨大的問題。一個真實的例子,其中會發生這種情況:

  • 阿帕奇網絡服務器,它加載以下模塊:
    • mod_php的這是對
      • libxml2的鏈接
    • mod_perl其中加載
      • 的libxml2

現在,如果一些PHP代碼修改像解析器選項的全局設置在libxml2的,Perl代碼也將看到這些變化。這可能會導致很難診斷的錯誤。所以你應該不惜一切代價避免共享庫中的全局狀態。

(含的libxml2可以使大部分設置在本地的這些日子。)

+0

感謝您的幫助! – zoska