静态库接口中未公开的类的名称冲突(c ++)

Tad*_*zys 0 c++ static-libraries visual-studio-2017

我有两个静态库(a.libb.lib)内部,库a有类Foo,但它没有在任何公开可用的包含中公开.库b.lib也有类Foo,它也没有在接口中公开.这些类位于同一名称空间中,并具有相同的构造函数签名.

当我调试或运行可执行文件(使用两个库)时,我发现错误的类lib a而不是lib b创建.试图了解这是如何发生的.这是链接器问题吗?(即类名是相同的,链接器插入它先找到的任何东西)

Som*_*ude 5

静态库很少比目标文件的档案更多.与静态库链接时,它与链接单独的目标文件相同.目标文件基本上是单个翻译单元.并且由于单一定义规则,您不能在具有相同名称的不同翻译单元中具有两个不同的类,因为这将导致未定义的行为.

如果要在库中包含"私有"类,请使用命名空间并在(唯一命名的)命名空间内定义"私有"类.

  • 但就是这样。OP 据称在同一命名空间中具有来自不同库的两个类。如果命名空间可能只是“PRIVATE”,或者类似的旨在“保护”类定义的通用名称,我不会感到惊讶。无论如何,这是支持模块的另一点(希望在 C++2a 中)。 (2认同)