重构/替换演员表的工具或方法的任何建议,例如:
(type*) data
成:
convert_to_type(data)
当data
具有更高优先级的运算符,括号或换行符时,事情变得更加棘手:
(type*) a(b)->
c
应该变为convert_to_type(a(b)->c)
而不是convert_to_type(a)(b)->c
等。
答案 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;
}