2017-10-13 185 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 - 你可能会想出一种方法来使用锤子来驱动螺丝钉,但使用螺丝刀会更好。 –

相关问题