c++ - 在 C++ 中混合 RTTI 标志

标签 c++ rtti

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

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

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

最后 3. 如果我在支持 RTTI 的库中创建一个类,我希望能够对其使用 dynamic_cast,如果我将该对象传递给不支持 RTTI 的库,我是否仍可以在那个 对象。 ...我假设不会,而且这似乎是个坏主意...我只是好奇。

最佳答案

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

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

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

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

关于c++ - 在 C++ 中混合 RTTI 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1490593/

相关文章:

c++ - 无法从 socket_.async_receive_from 接收数据

C++:无法使用字符串流操作打开文件

c++ - 数据结构中的 MST 和唯一性问题已解决 Ex?

delphi - 如何通过 RTTI 设置/获取 TStringGrid.Cells 等复杂事物的属性值?

C++:使用类型信息测试类继承

c++ std::types 而不是相应的 c 类型

c++ - 如何在不读取整个文件的情况下查找文件中字符串的长度

c++ - 使用 -fno-rtti 编译的共享库的子类类

c++ - 在实践中,从父级到子级的 dynamic_cast 何时有用?这总是不好的做法吗?

c++ - 如何使用 type_info 判断一个类型是否是子类?