我的問題是關於在共享庫內部創建的靜態變量(靜態void *)(我們稱之爲庫'S'),但它是一個內部變量,並未在外部顯示,但每次調用API都依賴於它。現在讓我們考慮一個案例,當一個程序(我們稱之爲主程序)鏈接到另外兩個共享庫,並且它們中的每一個都與庫S鏈接時。現在我們的主程序的靜態變量會發生什麼變化?它有一個實例嗎?二?共享庫內部的靜態變量
3
A
回答
3
0
編譯器爲每個全局靜態變量甚至創建一個不同的實例,當您有幾個具有相同名稱的變量時。
事實上,編譯器(或者可能是預處理器)根據聲明它的源文件的名稱隱式地改變每個這樣的變量的名稱。
您可以通過在頭文件中聲明全局靜態變量來證明這一點,然後將此頭文件包含在幾個不同的源文件中。嘗試在每個源文件中將其設置爲不同的值,並且您會看到該變量在每個源文件中保留其不同的值。
6
Suma的回答是正確的。只有一個靜態變量的實例。這也是爲什麼在共享庫中使用靜態全局變量可能是一個巨大的問題。一個真實的例子,其中會發生這種情況:
- 阿帕奇網絡服務器,它加載以下模塊:
- mod_php的這是對
- libxml2的鏈接
- mod_perl其中加載
- 的libxml2
- mod_php的這是對
現在,如果一些PHP代碼修改像解析器選項的全局設置在libxml2的,Perl代碼也將看到這些變化。這可能會導致很難診斷的錯誤。所以你應該不惜一切代價避免共享庫中的全局狀態。
(含的libxml2可以使大部分設置在本地的這些日子。)
+0
感謝您的幫助! – zoska
相關問題
- 1. 靜態方法內部變量共享
- 2. Swift中的共享(或靜態)變量
- 3. 兩線程共享靜態變量
- 4. 共享和靜態庫
- 5. 共享iPhone靜態庫
- 6. C++靜態庫中的共享全局變量:Linux
- 7. 共享庫加載的靜態變量損壞
- 8. 共享庫內部
- 9. 動態庫內共享庫的靜態初始化器
- 10. PHP:子類靜態繼承 - 子類共享靜態變量?
- 11. 取決於共享庫的靜態庫
- 12. 鏈接一個共享庫靜態到我的共享庫
- 13. C#並行共享內部變量
- 14. 混合靜態和動態(共享)庫?
- 15. 共享庫內的靜態庫的Android NDK調用API
- 16. 將共享庫轉換爲靜態庫
- 17. CMake:共享庫,使用靜態庫
- 18. Qt 5:共享庫和靜態庫
- 19. 混合靜態庫和共享庫
- 20. 混合共享庫和靜態庫
- 21. C++靜態庫和共享庫
- 22. 將靜態庫鏈接到共享庫?
- 23. SCons與靜態庫(.a)共享庫(.so)
- 24. 塊內部的靜態變量
- 25. Actionscript3函數內部的靜態變量
- 26. 公共靜態變量值
- 27. 部分共享變量
- 28. 鏈接靜態庫,共享另一個靜態庫
- 29. 共享對象中的靜態庫中的靜態函數
- 30. C++靜態鏈接共享庫
有「會是一個實例,因爲你宣佈它作爲一個靜態 – tarzanbappa
相關:http://stackoverflow.com/questions/3186926/shared-global-variable-in-c-static-library?rq = 1 – Suma
@Suma如何回答你提到的問題對我有幫助? – zoska