如何在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成功返回了结构的名称。为什么?
原始符号名称存在于二进制符号字符串中。我该怎么解决
预先感谢!

解决方法

在测试中,您正在通过FROM python:latest RUN mkdir /src WORKDIR /src COPY requirements.txt /src RUN pip install -r requirements.txt COPY . /src 调用使用静态类型信息(不需要rtti来解决)。

仅当glvalue表达式标识多态类型的对象时,才使用rtti。

如果expression是用于标识a对象的glvalue表达式 多态类型(即至少声明或继承的类 一个虚函数),typeid表达式对表达式求值 然后引用代表以下内容的std :: type_info对象 表达式的动态类型。如果获得了glvalue表达式 通过将一元*运算符应用于指针,该指针是一个 空指针值,std :: bad_typeid类型或类型的异常 从std :: bad_typeid派生。

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

另请参阅this comment