问题描述
我想在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。