c++ - 如何在 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 成功返回结构的名称。为什么?
并且原始符号名称存在于二进制符号字符串中。我该如何解决?
提前致谢!
解决方案
在您的测试中,您正在使用带有调用的静态类型信息typeid
(不需要 rtti 来解析)。
只有在识别多态类型对象的泛左值表达式的情况下,才会使用 rtti。
如果 expression 是标识多态类型对象(即声明或继承至少一个虚函数的类)的泛左值表达式,则 typeid 表达式计算表达式,然后引用表示该对象的 std::type_info 对象表达式的动态类型。如果通过将一元 * 运算符应用于指针获得 glvalue 表达式并且该指针是空指针值,则抛出 std::bad_typeid 类型或从 std::bad_typeid 派生的类型的异常。
您应该进行使用运行时类型信息的测试。
另请参阅此评论。
推荐阅读
- hive - 可以在 Hive 中创建子架构/文件夹吗?
- django - 尝试使用 {% include %} 在另一个应用程序的模板中包含表单,但得到“TemplateDoesNotExist”
- string - 获取句子中单词的第一个字母
- python - django-tables2 自定义表格可视化
- android - 即使进行了所有优化,Android Emulator 仍然滞后
- php - 将输入添加到条带表单
- vb6 - 由于“WS.Reputation.1”,Symantec Endpoint 删除了 VB6 IDE
- swift - NetService 在调试时获得正确的 Inet 类型,但不能从存档的 IPA 工作
- regex - 匹配正则表达式:仅在空格之间提取数字
- python - 从具有定义概率的 Pandas 组内进行抽样