gpt4 book ai didi

c++ - 不同的 C++ 类声明

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:40 24 4
gpt4 key购买 nike

我正在尝试使用未使用命名空间并导致符号冲突的第三方 C++ 库。冲突符号用于我的代码未使用的类,因此我正在考虑为第三方库创建自定义头文件,其中类声明仅包括我的代码正在使用的公共(public)成员,而忽略使用冲突类的任何成员。基本上是创建一个界面。

我有三个问题:

  1. 如果对 .obj 文件的编译有效,这种技术在我进行链接时是否仍会导致符号冲突?

  2. 如果这不是问题,那么不同的类声明是否会在链接时引起问题?例如,链接器是否验证每个 .obj 文件使用的类的声明具有相同数量的成员?

  3. 如果这些都不是问题并且我能够链接 .obj 文件,调用方法时是否会导致问题?我不知道 C++ 在幕后是如何工作的,但如果它使用索引指向类方法,并且这些索引在一个 .obj 文件与另一个文件之间是不同的,我猜这种方法会在运行时崩溃。

最佳答案

理论上,您需要相同的声明才能工作。

在实践中,您肯定需要确保您的声明包含:

  • 你使用的所有方法
  • 所有虚方法,无论是否使用。
  • 所有数据成员

您还需要按照正确的声明顺序进行所有这些操作。

您可能会伪造数据成员,但需要确保放入具有相同大小的 stub 。

如果您不执行所有这些操作,您将不会获得相同的对象布局,即使链接有效,它也会在运行时严重且快速地失败。

如果你这样做,我觉得它仍然有风险,而且最坏的情况可能看起来有效,但会出现奇怪的运行时故障。

“if it uses indexes”:在某种程度上,虚拟函数的确切工作方式是实现定义的,但通常它确实使用索引到虚拟函数表

您可以做的是:

  • 取原始标题
  • 保留您使用的类的完整声明
  • 去掉您不使用但被您使用的类和声明引用的类和声明。
  • 删除所有未引用的类型。

关于c++ - 不同的 C++ 类声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24502486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com