3

重构/替换强制转换的工具或方法的任何建议,例如:

(type*) data

进入:

convert_to_type(data)

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

(type*) a(b)->
              c

应该变成convert_to_type(a(b)->c)不等convert_to_type(a)(b)->c

4

4 回答 4

3

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

我知道的最好的选择是使用 g++,-Wold-style-cast它会帮助你警告所有这样的 C 风格的转换,允许你通过分析有问题的代码来正确地配置它们。这显然会比工具花费更多的时间,但它也让您有机会审查并防止工具进行不正确的转换。

于 2013-03-14T13:36:32.297 回答
2

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

实际上,我唯一能想到的就是 Clang。使用它的 AST 匹配器,您可以编写一个程序来检索对应于 C 样式转换的 AST 节点,然后发出文本替换。因为 Clang 的 AST 是完全语义感知的,所以您可以访问正在转换的表达式、它的类型以及它被转换为的类型。

工具或额外部分中有示例,例如,您可以查看Cpp11Migrate工具以进行匹配替换。

注意:如果你走这条路,你会想熟悉Clang 的 AST 。

于 2013-03-14T14:49:48.253 回答
1

重构/替换强制转换的工具或方法的任何建议,例如:

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

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

你最好一个一个地改变它们(这样你会引入更少的错误)。

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

于 2013-04-05T08:00:11.147 回答
0

有点认为这会在某个时候在你的脸上爆炸,但是:

template<typename T> T myFunc()
{
    // do stuff
    return (T) retVal;
}
于 2013-03-14T12:06:49.680 回答