2012-12-05 147 views
0

我正在重構一個非常大的代碼庫。以舊的方式,有兩個庫:FooFactoryBarLibBarLib取決於FooFactory而這又取決於很多的Foo1Foo2Foo3代碼等等時所建,FooFactory提取所有的Foo依賴關係,然後BarLib可以使用FooFactory要求的,也就是說,一個Foo7建設。在我的重構中,我使FooX所有人都依賴於FooFactory(而不是其他方式),並且如果makefile恰好鏈接它們,則靜態註冊它們自己。 BarLib仍然取決於FooFactory,但如果鏈接並因此靜態註冊到FooFactory,則只會成功創建Foo7可以extern解決這個問題或者我可以用其他方法解決這個問題嗎?

我遇到了以下問題:

有一個特殊的Foo14,其主要工廠的文件用繩子FooFactory.CFooFactory結構是BarLib套。它的工作方式是FooFactory.H公開了一個名爲setString(const std::string&);的全局函數,而在.C文件中它有一個匿名命名空間中的std::string theString變量。那麼BarLib中的方法可能會或可能不會使用此函數來設置此字符串。在FooFactory.C的語料庫中,該字符串在構建Foo14期間被檢查。

問題是,在依賴關係顛倒的情況下,Foo傢伙的所有構造代碼都保存在各自的庫中,只有在靜態註冊後纔會召喚。我沒有簡單的方法將std::string降至Foo14,因爲它遵循構建Foo所傳遞的參數的通用接口。如果我把字符串theString放在Foo14.C那麼這將迫使BarLib取決於Foo14爲了設置它...所以我想知道如果我可以保留它在FooFactory.C,但在Foo14聲明它爲extern並利用它。即使theString位於FooFactory.C的匿名命名空間中,這是否也能正常工作?或者現在必須成爲全球生活在頭上?或者什麼是替代解決方案?

回答

1

您不能從另一個文件是指在一個匿名的命名空間中定義一個變量,多看這裏:anonymous namespace

全局沒有共享標題來定義。爲了允許從其他文件引用它們,它們足夠不被定義在匿名命名空間中而不是靜態的。

+0

很高興知道謝謝 - 虐待檢查如何工作。 –

相關問題