用C ++中的函数调用替换强制转换

时间:2013-03-14 11:59:16

标签: c++ casting refactoring

重构/替换演员表的工具或方法的任何建议,例如:

(type*) data

成:

convert_to_type(data)

data具有更高优先级的运算符,括号或换行符时,事情变得更加棘手:

(type*) a(b)->
              c

应该变为convert_to_type(a(b)->c)而不是convert_to_type(a)(b)->c等。

4 个答案:

答案 0 :(得分:3)

我不知道一个能够自动正确解析和替换这些工具的工具。

我所知道的最好的选择是使用带有-Wold-style-cast的g ++,这将有助于警告你所有这些C风格的演员表,允许你通过分析相关代码来正确处理它们。这显然比工具花费的时间更多,但它也让您有机会审查并阻止工具进行错误的转换。

答案 1 :(得分:2)

在这种情况下,您需要一个语义感知的C ++解析器。没有那么多工具。

实际上,我唯一能想到的就是Clang。使用its AST Matchers,您可以编写程序来检索与C样式转换对应的AST节点,然后发出文本替换。由于Clang的AST具有完全语义感知功能,因此您可以访问正在进行转换的表达式,其类型它转换为的类型。

工具或附加部分中有一些示例,例如,您可以查看Cpp11Migrate工具,以便匹配替换。

注意:如果你走这条路,你会想要熟悉Clang's AST

答案 2 :(得分:1)

  

重构/替换演员表的工具或方法的任何建议,例如:

应该没有。这个问题很棘手,当C ++强制转换(static_cast,cost_cast等)被创建时,他们的一个明确目标是“使用自动化工具在代码中很容易找到它们。”

在某些情况下,在确定是否将一对括号用于算术运算(用于运算符优先级的括号),强制转换或其他内容之前,工具需要完全解析。

最好逐个更改它们(这样会减少错误)。

如果您的代码库很大,您也可以从为此目的编写自己的工具中受益(gcc对此有警告,因此它们应该很容易找到)。

答案 3 :(得分:0)

有点认为这会在某些时候爆炸,但是:

template<typename T> T myFunc()
{
    // do stuff
    return (T) retVal;
}