没有 RTTI 的情况下编译 c++ 什么时候会出现问题?

2024-04-09

我正在使用 gcc-fno-rtti标志在没有运行时类型信息的情况下编译我的 C++。

假设我没有使用dynamic_cast<> or typeid(),有什么可能导致我以后出现问题吗?


由于您的问题特定于 GCC,您应该仔细查阅您正在使用的版本的文档。 GCC 4.5.2 的文档说明如下。据我了解,这意味着如果你避免dynamic_cast() and typeid(),你应该没问题。

-fno-rtti
禁止生成有关每个类的信息 供 C++ 使用的虚函数 运行时类型识别功能 (dynamic_cast and typeid)。如果你 不要使用语言的这些部分, 你可以使用这个来节省一些空间 旗帜。注意异常处理 使用相同的信息,但它会 根据需要生成它。这dynamic_cast运营商仍然可以 用于不需要的演员 运行时类型信息,即强制转换 到void *或明确的基础 类。

关于虚拟功能和 RTTI 之间的关系的讨论可在没有 RTTI 但仍然是虚拟方法 https://stackoverflow.com/questions/34353751/no-rtti-but-still-virtual-methods。简而言之,虚拟函数在没有 RTTI 的情况下应该没问题。

正如此答案的评论之一正确指出的那样,混合使用不同 RTTI 设置编译的代码可能不起作用。来自最新的 GCC 文档:

将使用 -frtti 编译的代码与使用 -fno-rtti 编译的代码混合可能不起作用。例如,如果将使用 -fno-rtti 编译的类用作使用 -frtti 编译的类的基础,则程序可能无法链接。

避免此问题的一种方法是确保所有代码和依赖项均使用 -fno-rtti 进行编译。有关此问题的更详细讨论,请参阅 Andy G 的回答。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有 RTTI 的情况下编译 c++ 什么时候会出现问题? 的相关文章

随机推荐