有谁知道我可以用来在代码中查找明确的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);
有谁知道我可以用来在代码中查找明确的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);
如果你使用GCC/G ++,刚启用的C风格的警告转换:
g++ -Wold-style-cast ...
+1使用最好的工具和最简单的方法来完成这项工作...如果这是可行的。 – 2010-04-07 15:05:41
,这种石膏是如此难以搜索是一个事实首先介绍了新式演员的原因。如果你的代码正在工作,这看起来像是一个毫无意义的重构 - 我只需修改周围的代码就可以将它们更改为新的类型。尽管如此,在C++代码中你完全拥有C风格转换的事实将表明应该修复代码的问题 - 即使这是可能的,我也不会仅仅进行全局替换。
寻找正则表达式\)\w
可以获得惊人的好结果。
正是我在想什么! http://xkcd.com/208/ – ewall 2010-04-07 14:31:55
这只有在你把变量放在变量旁边时才有效......你应该始终这样做,但不是每个人都这么做。 – 2010-04-07 17:56:28
C风格演员阵容的一个问题是,因为他们依赖于方式超负荷的括号,他们不是微不足道的斑点。尽管如此,一个正则表达式,例如(例如在Python语法):
r'\(\s*\w+\s*\)'
是一个开始 - 它与括号内可选空白括号单个标识符相匹配。但是,当然,这不会赶上,例如,(void*)
铸 - 让尾随星号,以及,
r'\(\s*\w+[\s*]*\)'
你也可以开始一个可选const
进一步拓宽网尚,等等,等等
一旦你有一个很好的RE,许多工具(从grep
到vim
,从awk
到sed
,加上perl
,python
,ruby
等),可让您将它识别源所有的比赛。
如果您使用某种匈牙利风格的符号(例如iInteger
,pPointer
等),那么您可以搜索例如)p
和) p
等。
即使对于大型代码库,也应该可以在合理的时间内找到所有这些地方。
一个工具,可以准确地分析C++源代码并执行自动化的自定义更改(例如,您的演员替换)是DMS Software Reengineering Toolkit。
DMS拥有一个完整的C++解析器,可以构建AST和符号表,并且可以导航您的代码以可靠地查找C风格转换。通过使用模式引导匹配和重写,您可以提供一组规则,将所有这些C风格的转换转换为您所需的C++等价物。
DMS已被用于为波音和通用动力公司执行大规模自动化C++重新设计任务,每项任务涉及数千个文件。
当您插入自己的产品时,您应该事先说清楚。 – 2010-04-07 14:38:07
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++转换,此选项非常有用太多的努力。
噢,真好!一次真正的解析器:) – 2010-04-07 14:42:15
我已经与工具的描述回答一次,将发现和变化所有类型转换如果你想要它。
如果你想要做的就是找到这样石膏,还有另一种工具,将很容易地做到这一点,其实是这里的所有的“正则表达式”的建议极端的泛化。那是SD Source Code Search Engine。该工具使人们能够根据构成每种语言的语言元素搜索大型代码库。它提供了一个图形用户界面,允许您输入查询,查看单个命中,并通过单击一次鼠标在命中点显示文件文本。再次点击一下,你可以在你的编辑器中[对于许多编辑]在文件上。该工具还会在上下文中记录点击列表,以便稍后再次访问它们。
在你的情况,下面的搜索引擎查询可能得到大多数铸件:
'(' I ')' | '(' I ... '*' ')'
这意味着,找到标记序列,第一个是(,第二个是任何标识,第三个是“ )',或者包含以'*'结尾的类似的序列。
您不指定任何空白管理,因为该工具理解语言空白规则;它甚至会忽略演员阵容中的评论,并且仍然与上述相符。
[我的首席技术官供应该公司]
我以前在Visual Studio(2010年),这个正则表达式查找文件搜索框::i\):i
感谢某事物为灵感(his post)
什么是C式演员? – 2010-04-07 14:14:55
括号中的类型,例如。 (int)f – AshleysBrain 2010-04-07 14:16:38
@Bears(int)x例如。 – 2010-04-07 14:17:41