如何隔离两个同名的c ++类?

时间:2017-10-13 10:24:10

标签: c++ g++ elf

我有一个包含大量C ++测试文件的项目。每个测试文件都声明一个这样的类:

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

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

等等。

在测试套件变得非常大并且某些测试模块中Foo类的内容变得不同之前,一切都很好。在联系方面出现问题。每个ELF文件中的类的方法被声明为公共弱(" W"在nm表示法中)符号,并且它导致调用该方法的错误实例,例如, tests1.cppFoo::bar()拨打tests2.cpp

如何将class Foo的一个实例与另一个实例隔离开来?

使用__attributes__ ((visibility ("hidden")))声明该课程没有帮助,这些符号仍然是公开的。

同样可以肯定的是,我可以使用命名空间,但我更愿意避免使用此选项。

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

如果您不希望将任意名称归属于名称空间,那么您对名称空间的怀疑是没有根据的。

这是匿名命名空间的完美工作。写

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

等等。这样做会将Foo内部化到该特定翻译单元。