2012-03-13 41 views
2

假設我有(很大)C++模塊在namespace foo,它有很多(至少有一個)靜態數據,名稱空間全局數據和單例等等,分佈在無數的文件和目錄中。有沒有什麼辦法可以「整理」整個事物,以便同時運行獨立版本(即在同一個過程中)。在運行時將決定運行多少個版本。我可以沙盒使用靜態數據的名稱空間嗎?

我想過把所有東西都包裝在幾個命名空間中(例如bar1::foo,bar2::foo,...),但這是a)不可能的,因爲我不想觸摸所有文件,並且b)它不能讓我在運行時有一個任意數字。


更新:我在想也許我可以爲每個版本創建單獨的線程,但我不太熟悉線程。

+1

作爲一個邊注:不,我沒有寫'foo'和是的,我知道,靜態/單身是邪惡的。 – bitmask 2012-03-13 00:30:39

+0

+1,與第三方C接口有一次非常類似的問題。沒有找到一個好的解決方案(我的解決方案涉及多個宏生成的名稱空間)。 – 2012-03-13 01:14:07

回答

0

基本上你已經創建了狀態的命名空間,這是不好的,你想使用一個類,你應該能夠合理輕易改變它,這個用例,使其一類

那麼,你有

namespace foo{ 
    int state; 
    int func(); 
} 

foo::func(); 

你需要

class foo{ 
    int state; 
    int func(); 
}; 

foo foo1; 
foo1.func(); 
+0

不,我不是,'foo'很大!因此,這個問題。 – bitmask 2012-03-13 00:29:31

+0

但是你所描述的問題與一個類的用例是一樣的,爲什麼你不能使用一個類? – 111111 2012-03-13 00:31:30

+1

@bitmask命名空間和類是非常相似的結構,只有類可以被複制,如果foo是巨大的,那麼有多個副本仍然複製它:與類完全一樣。也許它會幫助你解決問題。 – 111111 2012-03-13 00:32:28

2

考慮把你的foo代碼共享對象內。在運行期間,您可以根據需要隨時加載和卸載共享對象。

有關共享對象的動態加載的初始參考,偷看在http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

+0

嗯。這應該工作。 – 2012-03-13 01:14:56

+0

不幸的是,'dlopen'的manpage告訴我們:「如果再次用dlopen()加載同一個庫,則返回相同的文件句柄。」所以這種方法直接起作用。 'libld'也足夠聰明,可以識別符號和硬鏈接。但是,複製共享對象庫會有訣竅。不過,由於這種性質,我們僅限於通過C(而不是C++)接口進行交談。 – bitmask 2012-03-13 02:48:21

相關問題