有没有工具可用于查找代码中的显式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样式强制类型转换:
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-style转换警告:
g++ -Wold-style-cast ...
搜索正则表达式 \)\w
可以得到出乎意料的好结果。
\(\w+ ?\*?\) ?\w
,但要注意误报。 - Marc.2377(?<!版权 )\(\w+ ?\*?\) ?\w
。 - Marc.2377Offload C++ compiler 支持选项以将所有此类转换报告为编译时错误,并将此类转换的语义限制为与 static_cast 更安全的等价形式。
相关选项如下:
-cp_nocstylecasts
-cp_c2staticcasts
一款能够准确分析C++源代码并进行自动化定制更改(例如,您的强制类型转换替换)的工具是DMS软件重构工具包。
DMS拥有完整的C++解析器,构建AST和符号表,因此可以浏览您的代码以可靠地查找C样式强制类型转换。通过使用模式导向匹配和重写,您可以提供一组规则,将所有这些C样式强制类型转换转换为所需的C++等效项。
DMS已被用于进行波音和通用动力公司的大规模自动化C++重构任务,每个任务涉及数千个文件。
我已经回答过一次,提供了一个工具的描述,如果你愿意,它可以找到并 更改 所有的强制类型转换。
如果你只想 查找 这样的强制类型转换,还有另一个工具可以轻松地完成这个任务,事实上,它是所有“正则表达式”建议的极端泛化。那就是 SD Source Code Search Engine。这个工具可以让你按照语言元素搜索大型代码库。它提供了一个GUI,允许你输入查询,查看单个命中,通过一次鼠标点击显示命中点处的文件文本。再点击一下,你就可以进入你的编辑器[对于许多编辑器]打开文件。该工具还会记录一个带上下文的命中列表,以便稍后重新访问。
在你的情况下,以下搜索引擎查询可能会得到大部分强制类型转换:
'(' I ')' | '(' I ... '*' ')'
这意味着,找到一个令牌序列,第一个是 (,第二个是任何标识符,第三个是 ')',或者涉及以 '*' 结尾的内容的类似序列。
您不需要指定任何空格管理,因为该工具了解语言的空格规则;它甚至会忽略转换中间的注释并仍然匹配上述内容。
[我是提供此工具的公司的首席技术官。]
r'\(\s*\w+\s*\)'
这是一个开始——它将带有括号内可选空格的单个标识符进行匹配。但是,当然无法捕获例如(void*)
的强制转换——为了获取尾随的星号,
r'\(\s*\w+[\s*]*\)'
你也可以从可选的const
开始,进一步扩大范围,等等。
一旦你有了一个好的正则表达式,许多工具(从grep
到vim
,从awk
到sed
,以及perl
、python
、ruby
等)都可以让你将其应用于识别源代码中所有匹配项。
如果您使用某种匈牙利命名法(例如iInteger,pPointer等),那么您可以搜索例如)p
和) p
等。
即使对于大型代码库,也应该能够在合理的时间内找到所有这些位置。