2017-10-13 122 views
1

我有一堆C++測試文件的項目。每個測試文件聲明這樣的類:如何隔離兩個具有相同名稱的C++類?

// test1.cpp 
... 
class Foo { void bar() {...} }; 
... 

// test2.cpp 
... 
class Foo { void bar() {...} }; 
... 

等。

一切都很好,直到測試套件變得相當大,並且Foo類的內容在某些測試模塊中變得不同。當涉及到聯繫時,事情就會出錯。每個ELF文件中類的方法被聲明爲公共弱(符號爲nm表示法中的「W」)符號,並且它導致調用該方法的錯誤實例,例如, tests1.cpp致電Foo::bar()tests2.cpp

如何從另一個隔離class Foo的一個實例?

聲明與__attributes__ ((visibility ("hidden")))類沒有幫助,符號保持公開。

也肯定我可以使用這個命名空間,但我寧願避免這個選項。

任何想法?

+5

你爲什麼要避免名稱空間?這就是他們被髮明的原因! – Steve

+3

您可以使用匿名命名空間,將'Foo'聲明包裝在'namespace {class Foo {...}; }'應該工作得一樣,並使編譯單元內部的'Foo'成爲內部函數。 – rodrigo

+0

@Steve我想修改一次(例如,在makefile中),而不是每次爲名稱空間創建一個新名稱。 – krokoziabla

回答

7

您對名稱空間的懷疑只要您不想將任意名稱賦予它們是毫無根據的。

這是一個完美的工作匿名命名空間。寫

namespace /*no name here makes it anonymous*/{ 
    class Foo { void bar() {...} }; 
} 

等等。這樣做會將Foo內聯至該特定翻譯單元。

+0

那麼,使用匿名命名空間可以解決這個問題。我只是擔心我無法將GTest的測試融入其中。但似乎我可以......所以我應該感謝你。但是......有沒有辦法解決它不在源代碼中,而是在編譯器方面? – krokoziabla

+0

@krokoziabla:我對此做出的保留意見是,您的源文件不會直接編譯。如果我是你,我會遭受額外的文字。 – Bathsheba

+0

@krokoziabla - 你可能會想出一種方法來使用錘子來驅動螺絲釘,但使用螺絲刀會更好。 –

相關問題