如何在Visual Studio 2008中关闭RTTI

时间:2011-07-28 21:27:12

标签: c++ visual-studio-2008 rtti

我不确定其他版本,但是,在VS 2008中,即使禁用了RTTI,我也可以通过在类型上调用typeid(T).name()来查询信息。它适用于所有类型,内部和用户创建。

我们的项目已禁用RTTI,但我惊讶地发现这仍然有效。这是一个Visual Studio错误还是/GR-标志不足以禁用它?这是否属于undefined behavior的范围?如果它不是一个bug,我该怎么把它关掉?

2 个答案:

答案 0 :(得分:6)

是否有可能在编译时已知类型的表达式上使用typeid?如果是这样,你将完全绕过RTTI的“运行时”方面。来自typeid上的Microsoft文档:

  

如果表达式既不是指针也不是对基类的引用   对象的结果是一个表示的对象的type_info引用   表达式的静态类型。表达式的静态类型是指   到编译时已知的表达式类型。执行   在评估一个静态类型时会忽略语义   表达

答案 1 :(得分:2)

首先,在禁用RTTI时使用typeid(或dynamic_cast)肯定会导致未定义的行为。我的建议是不要这样做。

在任何情况下,我都不相信你需要做除/GR-以外的任何事情来禁用微软编译器中的RTTI。这可能是一个错误,它在这样做时不会发出警告或错误。它会对dynamic_cast

发出警告
1>d:\src\MyClass.cpp (82) : warning C4541: 'dynamic_cast' used on polymorphic type 'MyClass' with /GR-; unpredictable behavior may result

但是,typeid没有给出任何警告。这在VS2010编译器中也没有改变。

附注:如果您尝试将typeid-fno-rtti一起使用,则gcc会出现编译错误,而clang则不会(尽管使用-Wall)。