【发布时间】:2011-11-03 20:11:25
【问题描述】:
在禁用 RTTI 的情况下,是否可以从 GCC 获取编译时 typeid 信息?在 Visual Studio 下,像 const char* typeName = typeid(int).name(); 这样的简单命令将适当地返回“int”,即使 RTTI 被禁用。不幸的是,GCC 不能这样做。当我尝试在没有 RTTI 的情况下调用 typeid 时,我的程序崩溃了。我知道禁用 RTTI 不是标准的一部分,但无论如何我可以强制 GCC 对已知类型进行编译时解析吗?
出于性能原因,RTTI 被禁用。我不需要运行时 RTTI。
编辑:
这就是我最终的结果:
template<typename T> const char* TypeName(void);
template<typename T> const char* TypeName(T type) { return TypeName<T>(); }
#define REFLECTION_REGISTER_TYPE(type) \
template <> const char* TypeName<type>(void) { return #type; }
它要求为每个需要反射信息的类型调用REFLECTION_REGISTER_TYPE。但只要为每种需要的类型调用它,调用TypeName<int> 就可以完美地工作。我还添加了函数TypeName(T type),这意味着你可以这样做:int x = 0; printf(TypeName(x));,它会打印出“int”。 GCC 应该能够像 VC++ 一样在编译时做到这一点。
【问题讨论】:
-
您关注哪些性能原因? RTTI 本质上是免费的,节省了一些二进制大小的开销。
-
@Kyle:在启用 RTTI 的 g++ 中,
typeid(int).name()将返回“i”而不是“int”。这相关吗? -
@R. Martinho Fernandes:GCC 有一些解构函数,可以将“i”转换为“int”。
标签: c++ reflection