C++ 用于查找C样式转换的工具

C++ 用于查找C样式转换的工具,c++,c,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); Foo-Foo=static\u cast(

有人知道我可以用什么工具在代码中查找显式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);
Foo-Foo=static\u cast(条形);
Foo-Foo=重新解释铸件(棒材);
Foo-Foo=常数(bar);

这样的类型转换很难搜索,这是一开始引入新型类型转换的原因之一。如果您的代码正常工作,这似乎是一个毫无意义的重构——只要修改周围的代码,我就会将它们更改为新样式的强制转换


< P >已经说过,在C++代码中,你有C风格的转换,这将说明代码应该是固定的问题,即使是可能的,我也不会做全局替换。

< p>搜索正则表达式<代码> \W/<代码>给出了令人惊讶的好结果。因为它们依赖于超负荷的括号,所以它们并不容易被发现。不过,正则表达式(例如,在Python语法中):

是一个开始——它匹配括号中的单个标识符,括号中有可选的空格。但当然,这不会被捕获,例如,
(void*)
强制转换——也会得到尾随的星号

r'\(\s*\w+[\s*]*\)'
你也可以从一个可选的
const
开始,进一步扩展网络,等等


一旦你有了一个好的RE,许多工具(从
grep
vim
,从
awk
sed
,再加上
perl
python
ruby
,等等)可以让你应用它来识别源代码中的所有匹配项。

如果你使用某种匈牙利风格的符号(例如,
iInteger
pPointer
等)然后您可以搜索例如
)p
)p


<> P>一个工具,它可以准确地分析C++源代码,并进行自动的自定义更改(例如,您的CAST替换)。

DMS有完整的C++解析器,构建AST和符号表,因此可以导航代码以可靠地找到C样式的铸件。通过使用模式匹配和重写,可以提供一组规则,将所有这样的C样式转换转换成所需的C++等价物。

DMS已被用来为波音和一般动力学执行大量的自动化C++重建任务,每一个都涉及数千个文件。

< P>支持所有编译报告的编译错误,并将这些转换的语义限制为STATICE-CAST的安全等价性。 有关的选择包括:

-cp_nocstylecasts   
编译器将在所有C样式转换上发出错误。C++代码中的C样式转换可能会不安全,导致不希望或未定义的行为(例如,将指针指向无关的结构/类类型)。此选项对于重构找到有用的所有转换,并用Struts映射等更安全的C++转换来替换。p>
-cp_c2staticcasts   
编译器将C++ STATICE-CAST的更受限语义应用到C样式转换。使用此选项打开代码,确保C样式的转换至少与C++静态安全性> /P>一样安全。

如果现有代码中有大量C样式的转换和重构,那么每个选项都是有用的。如果使用gcc/g++,只需启用C++样式的警告:

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

我已经回答了一次,描述了一个工具,如果你愿意的话,它可以找到并更改所有的强制转换

如果你想做的就是找到这样的类型转换,那么还有一个工具可以很容易地做到这一点,事实上,它是这里所有“正则表达式”建议的极端概括。这就是问题所在。此工具使您能够根据构成每种语言的语言元素搜索大型代码库。它提供了一个GUI,允许您输入查询,查看单个点击,并在点击点显示文件文本。再单击一次,您就可以在编辑器中[对于许多编辑器]查看一个文件。该工具还将在上下文中记录点击列表,以便您以后可以重新访问它们

在您的情况下,以下搜索引擎查询可能会获得大多数类型转换:

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

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


[我是这家公司的首席技术官。]

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


感谢某事物的灵感()

括号中的一种类型,例如(int)FoH,OK——他与C++风格形成对比。我对C++几乎一无所知,除了我所知道的C。我必须遵守编码准则:)这些准则大多是针对新代码类型的。只有在需要更改时,才会重构旧代码。例如,修复。仅仅为了重构而重构只需要花费时间(和金钱),没有任何好处。+1当你正在处理/重构周围的代码(可能是重新测试)时修复它们。@waffelman:只要没有人看到这些类型转换,就没有人会反对它们不符合你的指导原则。因此,当你(或其他人)发现它们时,请修复它们。积极寻找它们似乎是浪费时间。只是不要写太多,当你注意到旧的时,就把它们修好。当你给自己的产品插上插头时,你应该事先弄清楚。哦,太好了!一次真正的解析器:)+1使用最好的工具和最简单的方法完成任务。。。如果有效的话。只有当你把演员放在
'(' I ')'  | '(' I ... '*' ')'