以下问题的答案描述了C ++中static_cast
,dynamic_cast
和reinterpret_cast
的推荐用法:
When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?
您是否了解可用于检测此类演员滥用的任何工具?像PC-Lint或Coverity Static Analysis这样的静态分析工具会这样做吗?
提示这个问题的特殊情况是不恰当地使用static_cast
向下转换指针,编译器没有警告。我想使用工具检测这种情况,而不是假设开发人员永远不会犯这个错误。
答案 0 :(得分:5)
鉴于没有可靠的方法来告诉指针在编译时指向哪种类型,这在编译时很难解决。
最简单的方法是在运行时执行catch,使用宏“safe_cast”,它在编译时使用assert和发布中的static_cast编译为dynamic_cast。
现在,在调试期间,如果转换不合适,动态转换将返回NULL并断言。在发布期间也没有开销。
答案 1 :(得分:4)
Visual Studio对其中一些警告。例如,C4946。但是,默认情况下它们大部分都是关闭的。
答案 2 :(得分:0)
Boost提供了polymorphic_pointer_downcast()和polymorphic_downcast()函数,它们的作用类似于static_cast,但如果等效的dynamic_cast失败,它将断言(通常仅在调试版本中)。
有关详细信息,请参阅http://www.boost.org/doc/libs/1_61_0/libs/conversion/cast.htm。