用于查找C风格演员表的工具

时间:2010-04-07 14:12:14

标签: c++ c

有没有人知道我可以用来在代码中找到明确的C风格演员表的工具?我正在重构一些C ++代码,并希望尽可能替换C风格的转换。

示例C风格的演员阵容将是:

Foo foo = (Foo) bar;

相比之下,C ++样式转换的例子是:

Foo foo = static_cast<Foo>(bar);
Foo foo = reinterpret_cast<Foo>(bar);
Foo foo = const_cast<Foo>(bar);

9 个答案:

答案 0 :(得分:33)

如果你正在使用gcc / g ++,只需为C风格的强制转换启用警告:

g++ -Wold-style-cast ...

答案 1 :(得分:8)

这种演员阵容难以搜寻的事实是首先引入新式演员阵容的原因之一。如果你的代码工作正常,这似乎是一个相当无意义的重构 - 每当我修改周围的代码时,我只需将它们改为新式的转换。

话虽如此,你在C ++代码中使用C风格的强制转换这一事实表明代码存在问题应该修复 - 我不会做全局替换,即使这是可能的。

答案 2 :(得分:6)

搜索正则表达式\)\w会产生令人惊讶的好结果。

答案 3 :(得分:6)

Offload C++ compiler支持将所有此类强制转换报告为编译时错误的选项,并将此类强制转换的语义限制为与static_cast更安全的等效。

相关选项包括:

-cp_nocstylecasts   

编译器将在所有C样式转换上发出错误。 C ++代码中的C风格转换可能是不安全的,并导致不期望的或未定义的行为(例如,将指针转换为不相关的struct / class类型)。此选项对于重构以查找所有这些强制转换并将其替换为更安全的C ++强制转换(如static_cast)非常有用。

-cp_c2staticcasts   

编译器将C ++ static_cast的更受限制的语义应用于C样式转换。打开此选项编译代码可确保C样式的强制转换至少与C ++ static_casts一样安全

如果现有代码具有大量C样式转换并且将每个转换重构为C ++转换,则此选项非常有用。

答案 4 :(得分:1)

可以准确分析C ++源代码并执行自动自定义更改(例如,您的演员替换)的工具是DMS Software Reengineering Toolkit

DMS有一个完整的C ++解析器,构建AST和符号表,因此可以导航您的代码以可靠地找到C样式转换。通过使用模式定向匹配和重写,您可以提供一组规则,将所有此类C样式转换转换为所需的C ++等效项。

DMS已被用于为波音和通用动力公司执行大规模的自动化C ++再造任务,每个任务涉及数千个文件。

答案 5 :(得分:0)

C风格演员表的一个问题是,由于它们依赖于重载的括号,因此它们并不容易被发现。仍然是一个正则表达式,例如(例如在Python语法中):

r'\(\s*\w+\s*\)'

是一个开头 - 它匹配括号中的单个标识符和括号内的可选空格。但是,当然也不会捕捉到例如(void*)演员阵容 - 以获得尾随的星号,

r'\(\s*\w+[\s*]*\)'

你也可以从一个可选的const开始,进一步扩大网络等等。

一旦你有一个好的RE,很多工具(从grepvim,从awksed,加上perl,{{1} },python等)允许您应用它来识别源中的所有匹配项。

答案 6 :(得分:0)

如果您使用某种匈牙利风格表示法(例如iIntegerpPointer等),那么您可以搜索例如)p) p等等。

即使对于大型代码库,也应该可以在合理的时间内找到所有这些地方。

答案 7 :(得分:0)

如果您愿意,我已经回答过一次会找到并更改所有演员阵容的工具。

如果您想要做的只是找到这样的演员表,那么还有另一个工具可以轻松完成这项工作,实际上是对此处所有“正则表达式”建议的极端概括。那是SD Source Code Search Engine。该工具使人们能够根据构成每种语言的语言元素搜索大型代码库。它提供了一个GUI,允许您输入查询,查看单个匹配,并通过单击鼠标在命中点显示文件文本。再单击一下,您就可以在文件的编辑器中[对于许多编辑者]。该工具还将在上下文中记录命中列表,以便您稍后重新访问它们。

在您的情况下,以下搜索引擎查询可能会获得大多数演员表:

'(' I ')'  | '(' I ... '*' ')'

这意味着,找到一系列令牌,首先是(,第二个是任何标识符,第三个是')',或类似的序列,包含以'*'结尾的内容。

您没有指定任何空格管理,因为该工具了解语言空白规则;它甚至会忽略演员表中间的评论,但仍然符合上述情况。

[我是提供此服务的公司的首席技术官。]

答案 8 :(得分:-1)

我在Visual Studio(2010)中使用此正则表达式在文件中查找搜索框::i\):i

感谢某人的灵感(his post