9

如果我在 C++ 中有多个链接的 C++ 静态链接库,如果它们已使用启用/禁用运行时类型信息 (RTTI) 的不同值进行编译,它们是否可以共享(传递到函数和从函数传递)类对象?

--edit:感谢您的回复,我担心的具体事情是 1. 启用 RTTI 是否会改变 sizeof 对于静态(非多态类型)的行为?

并且,2. 如果我在启用 RTTI 的库中创建一个类并将其传递给另一个非启用 RTTI 的库,虚拟方法是否正常工作。(反之亦然)

最后 3. 如果我在启用 RTTI 的库中创建一个类,我希望能够使用 dynamic_cast,如果我将该对象传递给非启用 RTTI 的库,我仍然可以在对象上使用它。...我认为不会,无论如何这似乎是个坏主意...我只是好奇。

4

3 回答 3

7

RTTI 信息的存储方式是一个实现细节,因此不能跨不同的编译器移植。

此外,大多数编译器甚至不保证使用不同标志编译的对象将使用相同的 ABI 作为其方法。这在发布和调试库中最为突出,但其他标志也可能导致差异。

不仅函数/方法的 ABI 可能会改变,而且标志会影响编译器在结构中的元素之间使用的填充,因此即使没有虚拟方法的对象在使用不同标志编译时也可能不兼容。

使用大多数 IDS 时,您可以看到效果。Debug/Release 二进制文件被构建到单独的目录中,并且只链接到相同类型的二进制文件(任何用户定义的构建都将被构建到单独的唯一目录中,因为标志的差异可能导致不兼容)。如果您在构建中更改某些标志,则通常会强制重新构建整个项目。

于 2009-09-29T10:46:32.640 回答
1

这取决于你在谈论什么特定的 C++ 编译器——我最近没有真正的 C++ 跨平台经验(我近年来的 C++ 工作几乎完全是在 Linux 上使用 C++),但几年前我会打赌 gcc 会让你摆脱很多这样的混血,Visual C++“没办法”,其他编译器有点在中间......!-)

于 2009-09-29T04:49:31.123 回答
-1

只要共享的类不是多态的(即它们不包含虚函数),这就不成问题。但是您将无法在禁用 RTTI 的情况下使用 dynamic_cast、typeid 和异常。

于 2009-09-29T04:51:01.930 回答