【问题标题】:Replace cast by function call in C++用 C++ 中的函数调用替换强制转换
【发布时间】:2013-03-14 11:59:16
【问题描述】:

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

(type*) data

进入:

convert_to_type(data)

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

(type*) a(b)->
              c

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

【问题讨论】:

  • static_cast<type*>(data) 还是类型转换重载!?
  • 还要注意 (type*) data 是 C 风格的演员表。在大多数情况下,在处理多态类型时应该使用static_cast<type>(data)dynamic_cast<type>(data)
  • @MM.,他在问如何自动完成
  • 你当然不能用正则表达式可靠地做到这一点,因为 C++ 不是正则的。因此,唯一想到的就是创建一个基于 clang 的智能工具。
  • 您当然必须解析一些 C++。我不确定它是否需要像 clang 这样完整的东西,但它可以。毕竟,您不想更改int function(type*);之类的内容。

标签: c++ casting refactoring


【解决方案1】:

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

我知道的最佳选择是将 g++ 与 -Wold-style-cast 一起使用,这将有助于警告您所有此类 C 样式转换,允许您通过分析有问题的代码来正确配置它们。这显然会比工具花费更多的时间,但它也让您有机会检查并防止工具进行错误的转换。

【讨论】:

  • -Wold-style-cast 会吹出成千上万的假阴性,不幸的是,这对我来说不是一个选择。我想替换一个特定的演员表。
【解决方案2】:

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

其实我能想到的只有 Clang。使用its AST Matchers,您可以编写程序来检索对应于 C 样式转换的 AST 节点,然后发出文本替换。因为 Clang 的 AST 是完全语义感知的,所以您将可以访问正在转换的表达式、其类型 它转换为的类型。

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

注意:如果你走这条路,你会想结识Clang's AST

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • “你最好一个一个地改变它们(这样你会引入更少的错误)。”我没有你那么自信哈哈哈:)
    【解决方案4】:

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

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

    【讨论】:

    • 他不是在问如何定义这样的函数,而是在问如何自动替换所有演员表。
    猜你喜欢
    • 2010-10-07
    • 2013-02-27
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    相关资源
    最近更新 更多