我有一个包含大量C ++测试文件的项目。每个测试文件都声明一个这样的类:
// test1.cpp
...
class Foo { void bar() {...} };
...
和
// test2.cpp
...
class Foo { void bar() {...} };
...
等等。
在测试套件变得非常大并且某些测试模块中Foo
类的内容变得不同之前,一切都很好。在联系方面出现问题。每个ELF文件中的类的方法被声明为公共弱(" W"在nm
表示法中)符号,并且它导致调用该方法的错误实例,例如, tests1.cpp
从Foo::bar()
拨打tests2.cpp
。
如何将class Foo
的一个实例与另一个实例隔离开来?
使用__attributes__ ((visibility ("hidden")))
声明该课程没有帮助,这些符号仍然是公开的。
同样可以肯定的是,我可以使用命名空间,但我更愿意避免使用此选项。
有什么想法吗?
答案 0 :(得分:7)
如果您不希望将任意名称归属于名称空间,那么您对名称空间的怀疑是没有根据的。
这是匿名命名空间的完美工作。写
namespace /*no name here makes it anonymous*/{
class Foo { void bar() {...} };
}
等等。这样做会将Foo
内部化到该特定翻译单元。