如何找出C++风格转换的实际操作?

3

我正在处理一个相当老的代码库,其中有很多c-style的强制类型转换。

我知道c-style cast能做什么,但是如何快速找出像这样一行代码所做的事情:

WhateverClass* oldD = (WhateverClass*)d->GetHandle();

我知道我可以查看代码,找出GetHandle()返回的内容,确定它与WhateverClass的关系,然后推理出C风格转换的五种可能结果中哪种适用于此处。

尽管如此,我是一个容易犯错的人,我更愿意得到一个明确的答案而不需要自己进行推理。

我正在使用Visual Studio 2017,但我也对其他IDE和编译器感兴趣。


1
祝你好运!这正是为什么新的、表达性的转换操作符被创建的原因。旧的 C 风格强制转换太垃圾了... - U. W.
1个回答

1

谢谢你的回答,我知道clang-tidy,但是它有两个问题: 1)代码必须能够使用clang编译 - 在我的情况下(使用Visual Studio开发的具有3M行代码的MFC应用程序),这是一个巨大的任务。 2)clang-tidy警告cstyle强制转换的使用(这确实很有用),但据我所知,它并没有告诉你到底使用了哪种转换。 - pablo285
第二个原因——你可能是对的。但是——查看源代码——它可以被“修改”。在第48行,你可以放置关于它是什么类型转换的信息——查看MatchedCast->getCastKind()。与300万行代码相比,修改和重新编译clang-tidy并不费太大的努力。对于第一个原因——你是否尝试过使用其他开关,比如-std=C++03?或者只是为了这个“实验”,用clang兼容的替代代码来存根一些你的代码。我会朝这个方向去,或者尝试寻找其他静态分析工具,比如CppCheck? - PiotrNycz
使用getCastKind()并不简单 - 其结果不能直接映射到静态/常量/重新解释转换。其他开关也无济于事,因为我们已经在使用一些C++11代码。对某些代码进行存根处理并不是可行的选择。我会点赞你的回答,因为有些人可能会发现它有用,但不幸的是它并没有回答问题。 - pablo285

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接