2010-04-07 29 views
24

有谁知道我可以用来在代码中查找明确的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); 
+0

什么是C式演员? – 2010-04-07 14:14:55

+1

括号中的类型,例如。 (int)f – AshleysBrain 2010-04-07 14:16:38

+1

@Bears(int)x例如。 – 2010-04-07 14:17:41

回答

29

如果你使用GCC/G ++,刚启用的C风格的警告转换:

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

+1使用最好的工具和最简单的方法来完成这项工作...如果这是可行的。 – 2010-04-07 15:05:41

8

,这种石膏是如此难以搜索是一个事实首先介绍了新式演员的原因。如果你的代码正在工作,这看起来像是一个毫无意义的重构 - 我只需修改周围的代码就可以将它们更改为新的类型。尽管如此,在C++代码中你完全拥有C风格转换的事实将表明应该修复代码的问题 - 即使这是可能的,我也不会仅仅进行全局替换。

+0

我必须遵守编码准则:) – waffleman 2010-04-07 14:17:20

+0

大多数情况下,这些准则适用于输入新代码。旧代码只会在需要更改时重构。例如修复。仅仅为了重构而重构仅仅花时间(和金钱)而没有任何好处。 – RvdK 2010-04-07 14:57:21

+0

+1在修改/重构周围代码时(可能重新测试)会修复它们。 – 2010-04-07 15:15:01

5

寻找正则表达式\)\w可以获得惊人的好结果。

+1

正是我在想什么! http://xkcd.com/208/ – ewall 2010-04-07 14:31:55

+2

这只有在你把变量放在变量旁边时才有效......你应该始终这样做,但不是每个人都这么做。 – 2010-04-07 17:56:28

0

C风格演员阵容的一个问题是,因为他们依赖于方式超负荷的括号,他们不是微不足道的斑点。尽管如此,一个正则表达式,例如(例如在Python语法):

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

是一个开始 - 它与括号内可选空白括号单个标识符相匹配。但是,当然,这不会赶上,例如,(void*)铸 - 让尾随星号,以及,

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

你也可以开始一个可选const进一步拓宽网尚,等等,等等

一旦你有一个很好的RE,许多工具(从grepvim,从awksed,加上perlpythonruby等),可让您将它识别源所有的比赛。

0

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

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

1

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

DMS拥有一个完整的C++解析器,可以构建AST和符号表,并且可以导航您的代码以可靠地查找C风格转换。通过使用模式引导匹配和重写,您可以提供一组规则,将所有这些C风格的转换转换为您所需的C++等价物。

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

+8

当您插入自己的产品时,您应该事先说清楚。 – 2010-04-07 14:38:07

6

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

相关的选项有:

-cp_nocstylecasts 

编译器将所有的C-风格转换发出一个错误。 C++代码中的C风格转换可能会不安全,并导致不需要的或未定义的行为(例如将指针指向不相关的结构/类类型)。此选项对于重构来查找所有这些强制转换并将其替换为更安全的C++强制转换(如static_cast)非常有用。

-cp_c2staticcasts 

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

如果现有代码具有大量C风格转换并将每个转换重构为C++转换,此选项非常有用太多的努力。

+0

噢,真好!一次真正的解析器:) – 2010-04-07 14:42:15

0

我已经与工具的描述回答一次,将发现和变化所有类型转换如果你想要它。

如果你想要做的就是找到这样石膏,还有另一种工具,将很容易地做到这一点,其实是这里的所有的“正则表达式”的建议极端的泛化。那是SD Source Code Search Engine。该工具使人们能够根据构成每种语言的语言元素搜索大型代码库。它提供了一个图形用户界面,允许您输入查询,查看单个命中,并通过单击一次鼠标在命中点显示文件文本。再次点击一下,你可以在你的编辑器中[对于许多编辑]在文件上。该工具还会在上下文中记录点击列表,以便稍后再次访问它们。

在你的情况,下面的搜索引擎查询可能得到大多数铸件:

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

这意味着,找到标记序列,第一个是(,第二个是任何标识,第三个是“ )',或者包含以'*'结尾的类似的序列。

您不指定任何空白管理,因为该工具理解语言空白规则;它甚至会忽略演员阵容中的评论,并且仍然与上述相符。

[我的首席技术官供应该公司]

-1

我以前在Visual Studio(2010年),这个正则表达式查找文件搜索框::i\):i

感谢某事物为灵感(his post