在C ++中混合使用RTTI标志

时间:2009-09-29 04:40:31

标签: c++ rtti

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

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

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

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

3 个答案:

答案 0 :(得分:6)

如何存储RTTI信息是一个实现细节,因此不能在不同的编译器中移植。

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

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

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

答案 1 :(得分:1)

这取决于你所谈论的具体C ++编译器 - 我最近没有C ++的跨平台经验(近年来我的C ++工作几乎完全是用Linux上的C ++),但是几年前我敢打赌gcc会让你摆脱相当多的这种混乱,Visual C ++“没办法”,其他编译器有点中间......! - )

答案 2 :(得分:0)

只要共享的类不是多态(即它们不包含虚函数),这就不会有问题。但是,如果禁用RTTI,您将无法使用dynamic_cast,typeid和exception。