首页 > 解决方案 > 如何在 C++ 中为 MVSC 编译器禁用 RTTI?

问题描述

我想在 C++ 中禁用 RTTI。我正在使用 MSVC 编译器。我设置了编译器标志/GR-。以及要检查的示例代码:

#include <iostream>

#ifdef _CPPRTTI
#error "RTTI enabled"
#endif

struct TestStructureName_123456 {

};

int main() {
  printf("%s\n", typeid(TestStructureName_123456).name());

  return 0;
}

_CPPRTTI定义是否启用 RTTI ( info )。预处理器错误没有发生,这意味着 RTTI 被禁用。
但是 typeid 成功返回结构的名称。为什么?
并且原始符号名称存在于二进制符号字符串中。我该如何解决?
提前致谢!

标签: c++visual-c++rtti

解决方案


在您的测试中,您正在使用带有调用的静态类型信息typeid(不需要 rtti 来解析)。

只有在识别多态类型对象的泛左值表达式的情况下,才会使用 rtti。

如果 expression 是标识多态类型对象(即声明或继承至少一个虚函数的类)的泛左值表达式,则 typeid 表达式计算表达式,然后引用表示该对象的 std::type_info 对象表达式的动态类型。如果通过将一元 * 运算符应用于指针获得 glvalue 表达式并且该指针是空指针值,则抛出 std::bad_typeid 类型或从 std::bad_typeid 派生的类型的异常。

您应该进行使用运行时类型信息的测试。

另请参阅此评论


推荐阅读