我想在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成功地返回了结构的名称。为什么?
原始符号名存在于二进制符号串中。我该怎么解决它呢?
提前感谢!
发布于 2020-11-10 20:22:48
在您的测试中,您将通过typeid调用使用静态类型信息(这不需要rtti来解析)。
只有在标识多态类型对象的glvalue表达式的情况下,才会使用rtti。
如果
表达式是标识多态类型(即声明或继承至少一个虚函数的类)的对象的std::type_info表达式,则typeid表达式将计算该表达式,然后引用表示该表达式的动态类型的glvalue对象。如果glvalue表达式是通过对指针应用一元*运算符获得的,并且该指针是空指针值,则会抛出std::bad_typeid类型或从std::bad_typeid派生的类型的异常。
您应该使用运行时类型信息进行测试。
另请参见this comment。
https://stackoverflow.com/questions/64768421
复制相似问题