禁用某些类的RTTI

时间:2014-05-28 13:27:40

标签: c++ g++

我有一个C ++翻译单元,我需要在其中禁用两个类的RTTI,但没有别的。是否有#pragma rtti(off)之类的东西可供我使用?

我只需要为该类禁用RTTI。我没有抛出或捕获或者dynamic_cast或者这个类的任何东西,所以我根本不需要RTTI。它的方法的实现当然需要使用RTTI编译,因为它们确实可以抛出异常,它只是我需要抑制的这一个typeinfo对象的生成。

2 个答案:

答案 0 :(得分:3)

要在g ++中为特定类禁用RTTI而不执行任何其他操作(在有限的测试用例中测试,请谨慎操作):

  1. 将类定义移动到单独的头文件中。
  2. 向您的班级添加新的虚拟函数virtual void nortti();。使它成为第一个虚拟功能。
  3. 将其实现放在单独的源文件中。使用fno-rtti
  4. 编译此文件
  5. 正常编译其余的类实现。

答案 1 :(得分:2)

如果您使用的是Microsoft编译器,则可以使用__declspec(novtable)关闭特定类的vtable。这会导致RTTI在该类中失败。如果它是一个具体的类,这也是一个让你无法使用虚函数的副作用,这是一个相当严重的缺点 - 谨慎使用。它被设计用于基类永远不会被实例化的接口。

显然,g ++中没有相似的能力:Is there a g++ equivalent to Visual Studio's __declspec(novtable)?