如何在Visual Studio 2008中关闭RTTI

How to turn off RTTI in Visual Studio 2008

本文关键字:RTTI 2008 Studio Visual      更新时间:2023-10-16

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

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

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

如果表达式既不是指针也不是基类的引用对象的返回结果是一个type_info引用表达式的静态类型。表达式的静态类型引用转换为在编译时已知的表达式类型。执行类的静态类型计算时忽略语义表达式。

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

在任何情况下,我不相信你需要做任何事情,除了/GR-在微软的编译器禁用RTTI。这可能是一个bug,它在这样做时没有给出警告或错误。它给dynamic_cast一个警告:

1>d:srcMyClass.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一起使用)。