【问题标题】:How to disable RTTI in C++ for MVSC compiler?如何在 C++ 中为 MVSC 编译器禁用 RTTI?
【发布时间】:2021-02-22 08:42:35
【问题描述】:

我想在 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 成功返回结构的名称。为什么?
并且原始符号名称存在于二进制符号字符串中。我该如何解决?
提前致谢!

【问题讨论】:

  • 旁注:https://en.cppreference.com/w/cpp/language/typeid 表示“在使用 typeid 之前必须包含标头 (如果不包含标头,则每次使用关键字 typeid 都会导致程序格式错误。)”
  • 如果你去掉typeid()的使用,在编译的时候还要加上/Zi。它还包含符号名称吗?
  • 测试无效,编译器在编译时生成名称没有问题。您必须使用多态类(添加一个虚函数)对其进行测试,并将引用的 typeid 或取消引用的指针指向该类的对象。您将在编译时收到 C4541 以警告您它无法正常工作。
  • @HansPassant,好的,但是我可以阻止生成类型名称吗?我也在使用std::any,它存储类型,但我认为只能使用没有完整符号名称的类型哈希。

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


【解决方案1】:

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

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

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

您应该使用 runtime 类型信息进行测试。

另见this comment

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 2018-04-14
    • 2012-08-05
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多