如何在Visual Studio 2008中关闭RTTI
How to turn off RTTI in Visual Studio 2008
我不确定其他版本,但是,在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
一起使用)。
相关文章:
- dynamic_cast without RTTI
- 使用 RTTI 克隆唯一指针的向量
- 枚举和二进制或运算符(MISRA C++ 2008,4-5-2)
- 如何使用Visual Studio 2008将字符串映射到函数?
- 使用 2x1 图块平铺 2xM 数组以最大化差异 - INOI 2008,P2
- MSVC 2008,调试过程,无法调试
- std:任何没有RTTI的,它是如何工作的
- 生成可视C++ 2008 项目时出现链接器错误
- Visual Studio 2008 WriteFile
- VS 2008 和 VS 2017 中静态参数的不同行为
- 启用和禁用 RTTI 的模块之间的兼容性
- Microsoft Visual Studio 2008,版本9.0.30739.1 SP,DLL构建错误
- 如何在何处获取 MSVS 2008(32 位)编译器工具链的编译器,而无需安装 MSVS2008
- C++中的dynamic_cast在没有 RTTI 的情况下不起作用;为什么?
- 使用C RTTI(内置)通过字符串查找功能指针
- 为什么C++不使用集中存储类型信息以实现高效的 RTTI
- 如何防止Visual Studio 2008 C编译器在发生某些错误时停止?
- VS 2008 和 VS 2017 之间的可视化C++内存管理更改
- clang, std::function and -fno-rtti
- 如何在Visual Studio 2008中关闭RTTI