【发布时间】: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