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

标签 c++ g++ elf

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

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

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

等等。

一切都很好,直到测试套件变得相当大并且 Foo 类的内容在某些测试模块中变得不同。当涉及到链接时,事情就出错了。每个 ELF 文件中类的方法都声明为公共(public)弱(nm 表示法中的“W”)符号,这会导致调用错误的方法实例,例如tests1.cpptests2.cpp 调用 Foo::bar()

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

__attributes__ ((visibility ("hidden"))) 声明类没有帮助,符号保持公开。

当然我可以为此使用命名空间,但我宁愿避免使用此选项。

有什么想法吗?

最佳答案

就您不想给它们赋予任意名称而言,您对 namespace 的怀疑是没有根据的。

这对于匿名命名空间来说是一项完美的工作。写

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

等等。这样做会将 Foo 内化到那个特定的翻译单元。

关于c++ - 如何隔离两个同名的C++类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46727724/

相关文章:

c++ - 使用可变参数模板展开序列范围

c++ - 假设安装了 GCC 和 G++ 如何编译使用 boost 库的文件? (线程)

c++ - .bss 部分零初始化变量是否占用 elf 文件中的空间?

operating-system - 我应该制作自己的操作系统内核 ELF 还是原始二进制文件?

c++ - 访问 ELF 中的特定部分

c++ - AVX 256 位代码的性能略逊于等效的 128 位 SSSE3 代码

c++ - 四元数 FFT 在 C++ 中使用一维 FFT

具有指定模板参数的 C++11 make_pair 无法编译

C++ OpenCV 使用 vector<Point> 作为矩阵的索引

调试器严重检测到 C++ 段错误